HDFS中NameNode、SecondaryNameNode和DataNode工作机制

1,NN和2NN的工作机制

思考:NameNode中的元数据是存储在哪里的?


  首先,我们做一个假设,如果存储在NameNode节点的磁盘中,因为经常需要进行随机访问,还有相应客户请求,必然是效率过低。因此元数据需要存放在内存中。但是如果只存放在内存中,一旦断电,元数据丢失,整个集群就无法工作了。由此,产生了在磁盘中用于备份元数据的Fsimage。

  这样又会带来新的问题,当在内存中的元数据更新时,如果同时更新FsImage,就会导致效率过低,如果不更新,就会发生一致性问题,一旦NameNode节点断电,就会产生数据丢失。因此,引入Edits文件(只进行追加操作,效率很高)。没当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中。这样一旦NameNode节点断电,可以通过Fsimage和Edits的合并,和成元数据。

  但是,如果长时间添加数据到Edits中,会导致文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此需要定期将Fsimage和Edits进行合并,如果这个操作由NameNode节点完成,又会效率降低。因此引入一个新的节点SecondaryNameNode,专门用于Fsimage和Edits的合并。



1.1 NameNode和Secondary NameNode工作机制

其主要流程参考下图:
NameNode工作机制
(1)首先,集群启动,加载编辑日志和镜像文件到内存即Fsimage和Edits。此时来了一条元数据的增删改请求,因为HDFS对文件安全性要求较高,于是乎先进行第三步更新文件,记录操作日志,更新滚动日志。再更新内存,进行第四步的内存数据增删改。如下图:
HDFS启动


(2)此时2NN每隔一段时间就会请求NN一次,询问是否需要合并,CheckPoint。CheckPoint的触发条件有两种:一是定时间点到了(距离上次合并,到了xxx时间),二是Edits中的数据满了。如果触发了其中的一个,那么2NN就向NN请求合并CheckPoint。此时触发了合并。如下图:
触发合并CheckPoint


(3)此时NN把自己的Edits文件进行滚动,因为NN的读写不能停,于是乎在进行一个拷贝后还会创建一个新的Edits文件继续记录操作。上图的edits_001就是edits_inprogress_001的拷贝,用于传给2NN进行合并。同时创建了新的edits_inprogress_002用来继续记录操作。之后吧edits_001和fsimage发给2NN,如下图:
拷贝edits_001和fsimage


(4)fsimage和edits_001传给2NN之后,2NN将这两个文件加载到内存合并,生成一个新的Fsimage即fsimage.chkpoint,将这个文件再拷贝到NN。NN将fsimage.chkpoint重命名成fsimage。如下图:
合并完成


平时我们玩游戏比如魔兽争霸或者红警,都有存档。Fsimage就相当于内存的一个存档。Edits记录了每一步的操作。下次启动要还原状态只有fsimage存档是不够的,还需要读取edits中的操作记录,一步步执行后才能恢复到原来的状态。

1.2 CheckPoint时间设置

(1)通常情况下,2NN每隔一小时执行一次,在hdfs-default.xml中,3600秒即一小时

<property>
	<name>dfs.namenode.checkpoint.period</name>
	<value>3600</value>
</property>

(2)一分钟检查一次操作数,当操作数达到一百万时,2NN执行一次。

<property>
	<name>dfs.namenode.checkpoint.txns</name>
	<value>1000000</value>
	<description>操作动作次数</description>
</property>

<property>
	<name>dfs.namenode.checkpoint.check.period</name>
	<value>60</value>
	<description>1分钟检查一次操作数</description>
</property>

2,DataNode工作机制

 如上面文章所介绍的,NameNode存储的是元数据,比如fsimage和edits,而DataNode存储的是实际的数据块(还有一些数据块的元数据,如数据长度、时间戳、校验和)。

(1)DataNode启动后向NameNode注册,NN返回注册成功的信息,DN以后每周期(1小时)上报所有的块信息,(所谓的安全模式就是等待每个DN报告其块信息)如下图:
在这里插入图片描述


(2)心跳每三秒一次,心跳返回结果,带有NameNode给DN的命令,如果超过十分钟没有收到DN的心跳,则认为结果不可用。如下图:
在这里插入图片描述

2.1 掉线时间参数设置

(1)DataNode进程死亡或者网络故障造成DN无法与NN通信。
(2)NameNode不会立即把该节点判定为死亡,而是会经过一段时间,这段时间称作超时时长。
(3)HDFS默认的超时时长为10分钟+30秒
(4)如果定义超时时间为TimeOut,则超时时长计算公式为:TimeOut = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval,而默认的dfs.namenode.heartbeat.recheck-interval大小为5分钟,dfs.heartbeat.interval默认为3秒。

2.2 数据完整性

DataNode节点保证数据完整性的方法:
(1)当DN读取Block时,它会计算CheckSum校验和。
(2)如果计算后的CheckSum,和Block创建时的值不一样,说明Block已经损坏。
(3)Client读取其他DN上的Block。
(4)DN在其文件创建后周期验证CheckSum。
一般数据传输使用CRC,元数据传输使用MD5。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值