目录
显示
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
会安排从健康的副本创建新的副本来替换损坏的副本。
掉线时限参数设置
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>