文章目录
- (63)DataNode工作机制
- (64)数据完整性
- (65)掉线时限参数设置
- 参考文献
(63)DataNode工作机制
DataNode内部存储了一个又一个Block,每个block由数据和数据元数据组成。数据元数据包括数据长度、校验和、时间戳等。
在物理的目录里,每个block的数据和数据源数据是分两个文件保存的。
DataNode的工作机制如图:
- DataNode启动后,会向NameNode注册,表示自己活着,可以接受任务;
- NameNode接收到请求后,注册相应信息,并向DataNode返回注册成功的信号;
- 之后,DataNode会按周期(默认是6小时)向NameNode上报自己所保存的所有block信息,此举的目的是定时让NameNode知道,自己旗下的blocks是否都还可用;
- NameNode和DataNode每隔3s会来一轮心跳,目的是检查DataNode是否还活着,以及返回NameNode要带给DataNode的指令。
- 如果超过3s没联系上,NameNode也不会直接抛弃DataNode。一般是10min + 30s机制,即超过10分钟之后,再来30s,即10次心跳,如果还是没有联系上,NameNode才会认为这个DataNode挂了,之后NameNode将不会再对这个DataNode安排读写任务;
DN向NN汇报自身保存的blocks的时间间隔,默认是6h:
<property><name>dfs.blockreport.intervalMsec</name><value>21600000</value><description>Determines block reporting interval in milliseconds.</description>
</property>
DN 扫描自身节点块信息列表的时间,默认也是6h:
<property><name>dfs.datanode.directoryscan.interval</name><value>21600s</value><description>Interval in seconds for Datanode to scan data directories and reconcile the difference between blocks in memory and on the disk.Support multiple time unit suffix(case insensitive), as describedin dfs.heartbeat.interval.</description>
</property>
DN的正常流程是先自查(扫描自身块信息),后汇报。
(64)数据完整性
Hadoop在底层是如何知道数据是准确的还是不准确的,即DataNode如何验证数据完整性呢,它是如何发现自己保存的数据有问题呢?主要有这么三步:
(1) 将客户端上的原始数据封装,封装方式是在待传输数据后面,加上一位 奇偶校验位:
如果待传输数据是01000001,有两个1,是偶数,则奇偶校验位设置为0;
如果待传输数据是01001001,有三个1,是奇数,则奇偶校验位设置为1;
(2) 封装后的原始数据,通过网络传输,上传到HDFS上;
(3) HDFS接收到数据之后,会对数据进行再次的奇偶性校验,以避免网络传输过程中出现异常(DataNode也会在文件创建后周期性的验证校验位),比如说有的0被传成了1;
但这也是奇偶校验位的缺点,就是他只能检查一个0变成1的异常,如果是两个0同时变成了1,那么奇偶校验就校验不出来了。
不过,一般认为,同时坏两个数据位的概率是比较小的,所以奇偶校验位在常规情况下也足够应付。
但是这样做毕竟还是不保险,所以现在Hadoop里在封装时采用的,不是奇偶校验位,而是 crc校验位 。
crc校验位,又被称为循环冗余校验码,在通信领域应用的比较广泛。简单看了一下基本原理,比较复杂,简单来讲就是指定选定一个除数,使用原始数据与选定的除数进行二进制除法运算,计算出俩的余数就是crc校验位,一般为4位。
其中这个除数是发送端和接收端通用的。接收端收到原始数据后也会进行相同的运算,得到的结果跟校验位一样的话说明数据没问题,或者说直接拿封装后的原始数据去除,没有余数的话,说明没问题。
(65)掉线时限参数设置
就是之前说的那个DataNode的10min + 30s的超时机制。如果NameNode超过3s没有接收到DataNode的信息,NN不会立即判定该DataNode不可用,而是要经过一段时间,这段时间内仍然没有接收到心跳的话,才会认为该DataNode已经下线,而这段时间就被称为是超时时长。
作用可见63小节内容,我记在那里面了。
关于心跳时间和心跳超时时长(timeout,即10min + 30s机制)的设置,是在hdfs-site.xml里。
超时时长的计算公式:
timeout = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval
默认的heartbeat.recheck.interval是5min;默认的dfs.heartbeat.interval是3s。
<property><name>dfs.namenode.heartbeat.recheck-interval</name><value>300000</value>
</property><property><name>dfs.heartbeat.interval</name><value>3</value>
</property>
需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为秒。
参考文献
- 【尚硅谷大数据Hadoop教程,hadoop3.x搭建到集群调优,百万播放】