Hadoop学习笔记-HDFS(4)-HDFS读写流程和工作机制

HDFS的写机制

  1. 客户端向NameNode请求上传文件,NameNode检查该上传请求的权限以及目录结构,然后返回是否可以上传

  2. 如果可以上传,那么客户端会请求第一个数据分块Block应该上传到哪几个DataNode节点上

  3. NameNode返回对应的DataNode节点

  4. 客户端向对应的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。

  5. 当一个Block传输完成之后,客户端再次请求NameNode进行第二个Block的传输。

机架感知策略:如果客户端在DataNode上写入,则第一份写入自己所在的DataNode,如果不是,则随机选择一个DataNode。之后第二份选择写入与第一份不同机架的一个DataNode,第三份选择与第二份相同机架不同节点的一个DataNode。

HDFS的读机制

  1. 客户端向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址
  2. 挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据
  3. DataNode 开始传输数据给客户端(从磁盘里面读取数据输入流,以 Packet 为单位 来做校验)。
  4. 客户端以 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. 具体流程

  1. 第一阶段:NameNode启动
    1. 第一次启动NameNode格式化之后,创建Fsiamge文件和Edits文件;如果不是第一次创建,就将文件加载到内存中
    2. 客户端对元数据进行增删改的请求
    3. NameNode记录操作日志,更新滚动日志
    4. NameNode在内存中对元数据进行增删改
  2. 第二阶段:SecondaryNameNode启动
    1. Secondary NameNode 询问 NameNode 是否需要 CheckPoint。直接带回 NameNode 是否检查结果。
    2. Secondary NameNode 请求执行 CheckPoint。
    3. NameNode 滚动正在写的 Edits 日志。
    4. 将滚动前的编辑日志和镜像文件拷贝到 Secondary NameNode。
    5. Secondary NameNode 加载编辑日志和镜像文件到内存,并合并。
    6. 生成新的镜像文件 fsimage.chkpoint。
    7. 拷贝 fsimage.chkpoint 到 NameNode。
    8. NameNode 将 fsimage.chkpoint 重新命名成 fsimage。

Fsimage和Edits

  • Fsimage文件:是HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目录和文件inode的序列化信息
  • Edits文件:存放操作日志

合并Edits的时候,只会合并编号高于当前最大Fsimage编号的那些Edits文件

注意:fsimage中并没有记录块所对应的DataNode信息,这些信息是在集群启动的时候由DataNode向NameNode汇报的。

3. 文件查看

可以通过命令查看Fsimage文件

  1. ovi查看Fsimage文件

    1
    hdfs oiv -p 文件类型 -i 镜像文件 -o 转换后文件输出路径
    1
    hdfs oiv -p XML -i fsimage_0000000000000000025 -o ~/fsimage.xml
  2. 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中的配置

  1. 定时执行:默认SecondaryNameNode每隔一小时执行一次

    1
    2
    3
    4
    <property>
    <name>dfs.namenode.checkpoint.period</name>
    <value>3600s</value>
    </property>
  2. 当操作次数达到一百万的时候执行一次,每一分钟检查一次操作次数

    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. 工作机制

  1. 一个数据块在 DataNode 上以文件形式存储在磁盘上,包括两个文件,一个是数据 本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
  2. DataNode 启动后向 NameNode 注册,通过后,周期性(6 小时)的向 NameNode 上 报所有的块信息。
  3. 心跳是每 3 秒一次,心跳返回结果带有 NameNode 给该 DataNode 的命令如复制块 数据到另一台机器,或删除某个数据块。如果超过 10 分钟没有收到某个 DataNode 的心跳, 则认为该节点不可用。
  4. 集群运行中可以安全加入和退出一些机器

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
TimeOut = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval

对应在hdfs-site.xml中的配置信息:

1
2
3
4
5
6
7
8
<property>
<name>dfs.namenode.heartbeat.recheck-interval</name>
<value>300000</value>
</property>
<property>
<name>dfs.heartbeat.interval</name>
<value>3</value>
</property>
  • 前者单位为毫秒、后者单位为秒

参考文章

  1. Hadoop之HDFS的block、packet、chunk - 浮世间 - 博客园 (cnblogs.com)

Hadoop学习笔记-HDFS(4)-HDFS读写流程和工作机制
http://example.com/2022/02/18/Hadoop学习笔记-HDFS-4-HDFS读写流程和工作机制/
作者
EverNorif
发布于
2022年2月18日
许可协议