Hadoop学习笔记-HDFS(4)-HDFS读写流程和工作机制
HDFS的写机制
客户端向NameNode请求上传文件,NameNode检查该上传请求的权限以及目录结构,然后返回是否可以上传
如果可以上传,那么客户端会请求第一个数据分块Block应该上传到哪几个DataNode节点上
NameNode返回对应的DataNode节点
客户端向对应的DataNode节点上传数据
用户成功写入了一个数据块就认为成功,不关心后续副本的复制问题。每次创建副本的时候,当前Datanode只对下一个Datanode负责
客户端上传Block,以Packet为单位,每一个Packet会携带一个chunk。chunk是Hadoop中最小的单位。
Packet是Client端向Dataode,或者DataNode的PipLine之间传输数据的基本单位,默认
64kB
.Chunk是最小的Hadoop中最小的单位,是Client向DataNode或DataNode的PipLne之间进行数据校验的基本单位,默认
512Byte
,因为用作校验(自己校验自己),故每个chunk需要带有4Byte
的校验位。所以实际每个chunk写入packet的大小为516Byte,真实数据与校验值数据的比值为128:1。当一个Block传输完成之后,客户端再次请求NameNode进行第二个Block的传输。
机架感知策略:如果客户端在DataNode上写入,则第一份写入自己所在的DataNode,如果不是,则随机选择一个DataNode。之后第二份选择写入与第一份不同机架的一个DataNode,第三份选择与第二份相同机架不同节点的一个DataNode。
HDFS的读机制
- 客户端向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址
- 挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据
- DataNode 开始传输数据给客户端(从磁盘里面读取数据输入流,以 Packet 为单位 来做校验)。
- 客户端以 Packet 为单位接收,先在本地缓存,然后写入目标文件
NameNode和SecondaryNameNode工作机制
1. 简要描述
- fsimage文件:由Namenode存储的,文件系统中的元数据信息。该文件在Namenode启动时被加载到内存当中,并且一直保持只读状态。
- Namnode启动过程中,只接受读请求,不接受写请求(安全模式)
- 需要修改元数据的时候,不能直接修改fsimage文件。需要将修改事务写到一系列新的edits文件当中。edits文件会定时合并,成为新的fsimage文件
- fsimage和edits文件都存储在主节点的本地文件系统当中
- 如果存储文件过多或者数据分块过多,会造成fsimage文件过大,这也是为什么HDFS不适合存储海量小文件。并且在使用是,需要合理设置HDFS的文件分块大小
- Secondary Namenode可以帮助Namenode完成合并任务,降低Namenode的压力。Secondary Namenode负责将fsimage和edits文件合并形成新的fsimage文件。该过程周期性自动进行
- 合并的时候会通知Namenode,让其暂停使用当前的edits文件,将新纪录写到新的edits文件当中
2. 具体流程
- 第一阶段:NameNode启动
- 第一次启动NameNode格式化之后,创建Fsiamge文件和Edits文件;如果不是第一次创建,就将文件加载到内存中
- 客户端对元数据进行增删改的请求
- NameNode记录操作日志,更新滚动日志
- NameNode在内存中对元数据进行增删改
- 第二阶段:SecondaryNameNode启动
- Secondary NameNode 询问 NameNode 是否需要 CheckPoint。直接带回 NameNode 是否检查结果。
- Secondary NameNode 请求执行 CheckPoint。
- NameNode 滚动正在写的 Edits 日志。
- 将滚动前的编辑日志和镜像文件拷贝到 Secondary NameNode。
- Secondary NameNode 加载编辑日志和镜像文件到内存,并合并。
- 生成新的镜像文件 fsimage.chkpoint。
- 拷贝 fsimage.chkpoint 到 NameNode。
- NameNode 将 fsimage.chkpoint 重新命名成 fsimage。
Fsimage和Edits
- Fsimage文件:是HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目录和文件inode的序列化信息
- Edits文件:存放操作日志
合并Edits的时候,只会合并编号高于当前最大Fsimage编号的那些Edits文件
注意:fsimage中并没有记录块所对应的DataNode信息,这些信息是在集群启动的时候由DataNode向NameNode汇报的。
3. 文件查看
可以通过命令查看Fsimage文件
ovi查看Fsimage文件
1
hdfs oiv -p 文件类型 -i 镜像文件 -o 转换后文件输出路径
1
hdfs oiv -p XML -i fsimage_0000000000000000025 -o ~/fsimage.xml
oev查看edits文件
1
hdfs oev -p 文件类型 -i 编辑日志 -o 转换后文件输出路径
1
hdfs oev -p XML -i edits_0000000000000000012-0000000000000000013 -o ~/edits.xml
4.CheckPoint时间设置
在hdfs-default.xml中的配置
定时执行:默认SecondaryNameNode每隔一小时执行一次
1
2
3
4<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600s</value>
</property>当操作次数达到一百万的时候执行一次,每一分钟检查一次操作次数
1
2
3
4
5
6
7
8
9
10</property>
<name>dfs.namenode.checkpoint.txns</name>
<value>1000000</value>
<description>操作动作次数</description>
</property>
<property>
<name>dfs.namenode.checkpoint.check.period</name>
<value>60s</value>
<description> 1 分钟检查一次操作次数</description>
</property>
DataNode工作机制
1. 工作机制
- 一个数据块在 DataNode 上以文件形式存储在磁盘上,包括两个文件,一个是数据 本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
- DataNode 启动后向 NameNode 注册,通过后,周期性(6 小时)的向 NameNode 上 报所有的块信息。
- 心跳是每 3 秒一次,心跳返回结果带有 NameNode 给该 DataNode 的命令如复制块 数据到另一台机器,或删除某个数据块。如果超过 10 分钟没有收到某个 DataNode 的心跳, 则认为该节点不可用。
- 集群运行中可以安全加入和退出一些机器
DataNode向NameNode上报信息的设置
1
2
3
4
5
6
7
8
9
<property>
<name>dfs.blockreport.intervalMsec</name>
<value>21600000</value>
</property>
<property>
<name>dfs.datanode.directoryscan.interval</name>
<value>21600s</value>
</property>
2. 数据完整性
DataNode节点检查数据完整性,使用crc校验算法。
DataNode在读取Block的时候会计算校验和,如果计算得到的校验和与Block在创建的时候得到的校验和不一致,说明Block已经损坏,数据不可用。则让Client去读取其他DataNode上的Block。
并且在DataNode内部,也会在文件创建之后周期性验证它的校验和。
3.掉线时限参数设置
DataNode进程死亡或者网络故障,会导致DataNode无法与NameNode进行通信。如果经过连续一段时间之后,NameNode仍然没有收到该DataNode的心跳信息,那么就认为这个DataNode已经挂掉了,不能使用。这段时间称作超时时长。HDFS默认的超时时长为10分钟+30秒。
实际的超时时长计算公式如下
1 |
|
对应在hdfs-site.xml
中的配置信息:
1 |
|
- 前者单位为毫秒、后者单位为秒