image.png
image.png|450

DataNode数据结构

  • 一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
  • 数据大于128MB(块大小)时,会进行分块。
  • 如果数据小雨128MB,会直接按照数据的大小进行存储。

    块信息上报

    DataNode启动后向NameNode注册,通过后,周期性(6小时)的向NameNode上报所有的块信息。
    DN向NN汇报当前解读信息的时间间隔,默认6小时;

    <property>
    <name>dfs.blockreport.intervalMsec</name>
    <value>21600000</value>
    <description>以毫秒为单位确定数据块报告间隔。</description>
    </property>

    DN扫描自己节点块信息列表的时间,默认6小时

    <property>
    <name>dfs.datanode.directoryscan.interval</name>
    <value>21600s</value>
    <description>Datanode 扫描数据目录并核对内存和磁盘中数据块差异的时间间隔(以秒为单位)。支持多个时间单位后缀(不区分大小写),如中所述。
    </description>
    </property>

心跳

心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。

数据完整性校验

CRC 校验机制(循环冗余校验)

  • HDFS 使用 CRC (Cyclic Redundancy Check) 来保证数据在存储和传输过程中的完整性。
  • 每当数据块被写入 DataNode 时,HDFS 会为每个 64KB 的数据片段计算并生成一个 CRC 校验码
  • 这些 CRC 校验码会存储在一个独立的元数据文件中,位于与数据块相同的 DataNode 上。

写入时校验

  • 在数据写入时,客户端会计算每个数据包的 CRC,并将其与数据包一起发送到 DataNode
  • DataNode 接收到数据后,会根据接收到的数据重新计算 CRC,并与客户端发送的 CRC 进行比较。如果一致,说明数据包传输正确,DataNode 才会将数据写入磁盘。

读取时校验

  • 当客户端从 DataNode 读取数据时,DataNode 会重新计算数据块的 CRC,并将其与存储的 CRC 校验码进行对比。如果一致,数据才会传输给客户端。这确保客户端获取到的块是完整且未损坏的。

周期性数据块扫描

  • DataNode 还会定期扫描其存储的数据块,通过计算存储的数据块的 CRC 来检查数据是否出现损坏或位腐蚀。
  • 如果发现数据损坏,DataNode 会向 NameNode 报告损坏的块,NameNode 会安排从其他副本恢复该数据块的完整性。

冗余机制(数据副本)

  • HDFS 通过数据冗余(默认情况下,每个块有 3 个副本)进一步增强数据的可靠性。如果一个 DataNode 上的某个块损坏,客户端可以从其他副本读取该数据块。
  • 如果发现某个副本损坏,NameNode 会安排从健康的副本创建新的副本来替换损坏的副本。

掉线时限参数设置

image.png

  • 2 :表示 NameNode 经过一次心跳检测失败后,额外多等待两个心跳重检查间隔的时间。
  • dfs.namenode.heartbeat.recheck-interval = 300 秒(5 分钟)
  • dfs.heartbeat.interval = 3 秒
    
    <property>
    <name>dfs.namenode.heartbeat.recheck-interval</name>
    <value>300000</value>
    </property>

<property>
<name>dfs.heartbeat.interval</name>
<value>3</value>
</property>