HDFS-学习日记

Hadoop~HDFS

一、Hadoop概述

1. Hadoop起源

Hadoop起源于Apache Nutch项目,始于2002年,是Apache Lucene的子项目之一。2006年2月将Hadoop单独分离出来,成为一套单独的系统框架,被称为Hadoop的1.x版本。

2012年更新Hadoop2.x版本,其中推出了yarn架构作为Hadoop框架的资源管理器是重要提升。yarn的作用是将Hadoop的计算和资源管理调度解耦。

Hadoop3.x版本在结构上并没有较之前大版本有所改变。

2. Hadoop的组成结构

  • HDFS:分布式文件存储系统
  • yarn:资源调度器
  • MapReduce:数据运算框架

二、HDFS

1. HDFS概述

HDFS(分布式文件存储系统)作为Hadoop框架下的存储系统,包括NameNode(NN)、DataNode(DN)、SecondaryNameNode(2NN),这三个组件共同构成了HDFS的存储系统。

1. NameNode

NN作为HDFS集群的重要组成,负责存储、管理HDFS中存储的文件元数据信息。元数据信息包括文件名、目录结构、文件属性(副本数、文件权限等)、数据块列表、数据块所在DN的信息

NN除了保存元数据信息,还负责处理客户端对数据上传、下载的请求,管理、分配DN作为数据存储节点。

2. DataNode

DN作为数据的存储节点,负责存储真实数据块数据的校验和

3. SecondaryNameNode

2NN的存在是为了辅助NN工作,减轻NN的压力。定时合并、备份集群的元数据信息。

2.HDFS的特点

1. 优点
  1. 高容错性:HDFS在保存文件时或保存多份副本,默认保存3份,可以通过配置文件修改。当一份副本损坏时,会从没损坏的数据副本复制数据。
  2. 适合处理PB级以上的数据。
  3. 可以构建在廉价的、性能较差的服务器运行。
2. 缺点
  1. HDFS很难实现低时延的数据访问,无法做到毫秒级数据操作。
  2. HDFS对小文件十分敏感,不擅长存储、处理小文件。
  3. HDFS不支持数据并发写入,不支持文件随机修改

三、DataNode的节点选择机制

NN在给Client(客户端)分配DN节点时,尽量按照“就近原则”进行分配。

  1. NN首先判断Client所在的服务器有没有可用的DN节点,如果有则选择该节点为DN1;如果没有可用节点,则选择同一机架上的可用的节点作为DN1
  2. 如果同一机架上也没有可用的节点作为DN1,则选择其他机架上的可用节点作为DN1
  3. DN1选择完毕后,在其他机架选择一个可用的节点作为DN2
  4. DN2选择完毕后,在DN2所在的机架随机选择一个节点作为DN3
  5. 如果不只3个节点,其余节点随机选择

为什么这样分配?

DN不都放在同一服务器是为了防止该服务器出现故障导致数据丢失时,没有可用副本恢复数据。

DN2和DN3放在同一机架是为了提高HDFS的效率。

四、HDFS的读写数据流程

1. 写数据流程 ----- 数据上传

向HDFS写入数据时,默认将数据按照128MB的大小切分为数据块。完整的数据将以若干数据块的形式存储在DN上。具体步骤如下:

  1. Client首先实例化一个连接对象(Distributed FileSystem),通过该对象实现连接。

  2. Client向NN发送上传数据请求,NN会检查当前用户是否由上传权限,并校验目标数据的合法性。之后NN向Client反馈请求结果。

  3. Client之后向NN请求上传数据,并向NN请求DN作为数据存储节点。NN会根据Client的实际情况返回DN的信息。

  4. 获取DN的信息后,Client会实例化文件传输流对象(FSFataOuputStream)操作数据流上传数据。该对象向最近的DN通信,建立数据传输通道。

  5. 之后DN1DN2通信建立通道,DN2DN3通信……之后DN之间相互做出应答。

    这样的设计是为了减轻客户端的IO压力。

  6. 通道建立完成后,Client按照==Packet(数据包)为单位==向DN1传输数据。

    每个Packet大小为64KB,包含127份(chunk 512Bytes + sumchunk 4Bytes),chunk存储的是真实数据,sumchunk存储的是数据校验和

  7. 当Packet按照顺序发送到DN1后,DN1会将这个Packet发送给DN2……DN写入数据时是并行执行的

    数据写入时按照chunk的顺序先存放在Dataqueue,整个Packet全部写入队列后,再按照chunk的顺序写进Ackqueue,之后再将数据写入DN的IO保存。如果从Dataqueue写入Ackqueue时发生错误,Ackqueue中的数据会==“回滚”==到Dataqueue中,等到通道正常之后再开始写入数据。

  8. 数据全部写入完成后,Client会跟DN断开连接,并向NN汇报。

数据块默认为128MB是根据当前磁盘的IO速度设定的,如果磁盘IO速度快,可以自定义数据块大小。

2. 读数据流程 ----- 数据下载

HDFS的读取数据流程(数据下载)相较写数据要简单得多,具体步骤如下:

  1. Client实例化一个连接对象(Distributed FileSystem),获取连接后向NN发送读取文件请求。NN会将目标文件的元数据信息返回给Client。

  2. 获取元数据后,Client实例化一个输入流对象(FSdatainputstream)对象,通过该对象向距离Client最近的DN建立传输通道,按照数据块的顺序将数据读入本地缓存。

  3. 当所有数据块缓存完毕并且没有损坏之后,将数据写入本地IO。

    如果所存的数据块不全存放在一个DN上,则客户端会按照数据块的顺序先后从对应的DN下载数据块到缓存。

五、NN和2NN

注意:2NN并不是NN的热备,当NN发生故障时,2NN不能替代NN对外提供服务,只能恢复部分NN的元数据信息。

1. 元数据管理

元数据是HDFS中十分重要的数据信息,存储HDFS中存储数据的详细信息。因此,元数据不支持随机修改,只能向文档末尾追加信息

元数据分为两部分:一份存在磁盘中,另一份存储在内存中。最新的元数据信息= 内存中的元数据+磁盘中最大编号的元数据

对元数据进行操作时,实际上操作的是内存中的元数据信息。内存中的操作信息会被追加到edits文件中,当符合要求时会将元数据信息进行合并。

2. NN中的元数据管理

NN中存有两种元数据信息:fsimage文件和edits文件。

  • fsimage文件:是xml类型的文件,存放真正的元数据
  • edits文件:内存中的元数据的操作记录会被追加到edits文件中。
元数据合并流程

NN只有在刚启动集群时,才会自己合并元数据,其他时候由2NN负责合并元数据信息。

  1. 当NN中的元数据信息满足一定条件时,2NN会通知NN将要进行元数据合并。由于NN仍需要对外提供服务,所以NN会停止向正在使用的edits文件中追加元数据操作记录,另外生成一份文件存放最新的操作记录
  2. 2NN从NN处获取fsimage文件和edits文件后,会将两份元数据信息进行合并,将最新的元数据发送到NN本地保存,同时2NN也会保留一份元数据作为NN的备份,
  3. NN收到最新的元数据信息后,会将上一次的元数据保留,作为历史记录。

3. 2NN的工作机制

  1. 2NN每隔60s检查一次NN中的edits_inprogress是否达到100万条记录(chickpoint)。如果达到要求,则向NN发送合并元数据的请求。如果edits_inprogress一直没有满足100万条的要求,2NN会检查本地时间,自集群启动后的每1小时合并一次元数据。
  2. NN收到请求后,会立即停止向正在使用的edits文件追加元数据操作记录,转向新生成的文件中追加记录。
  3. 2NN会从NN处拷贝正在使用的edits_progress文件和最大编号的fsimage文件。拷贝到2NN本地后,将两份文件进行合并。
  4. 合并完成后,2NN会将最新的元数据文件(fsimage.chkpoint)发到NN本地保存,并且保留一份文件作为NN的备份。
  5. NN获得最新的元数据文件后,会将上一次的元数据保留作为历史备份,最新的元数据文件改名后保存。

为什么2NN保留上一次的元数据备份,还需要每次从NN处获取呢?

因为一旦集群故障需要重启,NN重启后会亲自合并元数据,当达到下一次合并元数据条件时,NN中的fsimage文件已经发生改变,而2NN中的备份并没有重启之后的记录,所以需要从NN处获取fsimage文件和edits文件。

六、DN的工作机制

1. 心跳信号和掉线限制

1. 心跳信号

DN为了保证数据的完整性,除了真实数据块之外,还存储了数据长度、数据校验和、时间戳

心跳信号就是ping一下NN的主机地址,DN的工作流程如下:

  1. 集群首次启动后,DN会向NN注册自己,并立即向NN汇报当前DN上的所有数据信息
  2. 之后DN每隔6小时向NN汇报一次。
  3. 除了汇报工作之外,正常工作中DN每隔3s向NN发送一次心跳信号,NN会将心跳信号返回,返回的信号中包括NN对DN下达的命令
2. 掉线限制

如果心跳信号超过3s,NN不会立即判定该节点不可用,当超过10分钟+30s后还没有心跳信号,NN才会判定该节点为不可用状态

2. 数据完整性

为了保证数据的完整性,DN会核验数据的校验和。

  1. 当DN读取到Block信息时,会计算该Block的校验和(CheckSum)。
  2. 如果核验校验和时发现与刚写入数据时的校验和不一致,则判定此数据块损坏。
  3. 损坏数据的DN会找到最近的保存文件副本的DN,并完成Block更新。

8.新节点的服役、退役

1. 服役

当需要扩展新的存储节点时,只需要将新的服务器设置好目标集群的配置,并更该主机名、IP信息。之后启动DataNode和NodeManager就完成了新节点的扩展。

	#单点启动命令
	hdfs --daemon start datanode		启动datanode
	yarn --daemon start nodemanager		启动nodemanager

2. 退役

当一台服务器需要移出集群,但是服务器的数据需要保留备份时,需要退役服务器。

使用黑名单、白名单的机制管理集群服务器。

在NN的节点服务器的**/opt/module/hadoop-3.1.3/etc/hadoop**目录下创建黑名单和白名单文件。

白名单的服务器就是正常运行的服务器。

黑名单中的服务器会在完成数据迁移后退出集群

创建好黑白名单后,需要向hdfs-site.xml中追加配置信息。并将配置文件和黑白名单文件分发到所有集群服务器。

<!-- 白名单 -->
<property>
<name>dfs.hosts</name>
<value>/opt/module/hadoop-3.1.3/etc/hadoop/whitelist</value>
</property>
<!-- 黑名单 -->
<property>
<name>dfs.hosts.exclude</name>
<value>/opt/module/hadoop-3.1.3/etc/hadoop/blacklist</value>
</property>

服务器完成退役后,不需要重启集群,只需要刷新集群就可以。

	hdfs dfsadmin -refreshNodes		刷新hdfs节点信息
	yarn rmadmin -refreshNodes		刷新yarn节点信息
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值