您的位置:首页 > Web前端 > Node.js

NameNode、SecondryNameNode和DataNode工作机制

2020-07-13 05:07 429 查看
这里先补充一下什么是元数据

1、第一类是文件和目录自身的属性信息,例如文件名、目录名、父目录信息、文件大小、创建时间、修改时间等。
2、第二类记录文件内容存储相关信息,例如文件块情况、副本个数、每个副本所在的Data Node 信息等。
3、第三类用来记录HDFS中所有Data Node信息,用于Data Node管理。

        首先,我们要思考的是namenode里面的元数据存放在哪里?答案是毋庸置疑的,肯定在是内存中;如果元数据存放在磁盘中,当经常需要进行随机访问,还有响应客户请求,效率过低。但是如果只存在内存中,一旦断电,元数据丢失,整个集群就无法工作了。因此引入了Fsimage(镜像文件),也就是在磁盘中备份元数据的镜像文件。
        但是这个时候又会出现一个问题,如果一直在更新FsImage,就会导致效率低;如果不更新,一旦namenode断电,内存中的元数据和fsimage中的不一致,导致一致性问题。因此,引入Edits(编辑日志)。
        Edits文件只进行追加操作,所以效率很高。每当元数据有更新或者添加的时候,修改内存中的元数据并追加到Edits中(查询操作不写入)。这样,一旦NameNode节点断电,可以通过FsImage和Edits的合并,合成元数据。
        因此,需要定期对FsImage和Edits进行合并,这个操作就是由SecondaryNameNode来完成(所谓的合并,就是将Edits和Fsimage加载到SecondaryNameNode内存中,不是NameNode,照着Edits中的操作一步步执行,最终形成新的Fsimage)。

        上述图片为NameNode(下面简称NN)和SecondaryNameNode(下面简称2NN)工作机制。
        NN的工作流程(对应上图的蓝色线):
                1、每次NN一上电,就会加载磁盘中的edits和fsimage到内存中,保证每次的元数据都是最新的
                2、当客户端发送对元数据的增、删、改操作(注意没有查)
                3、NN就会记录相关操作,并更新edits
                4、Edits更新之后,才对内存中的元数据进行相应的操作
                注意:3、4步的顺序不能反。如果先更新内存中的数据,还没来得及对edits进行更新就断电,会造成数据丢失;先往edits中记录,如果此时NameNode挂掉,重启后就会从Edits中读取元数据的信息。
        2NN的工作流程(对应上图的橘黄色线):
                1、请求是否需要CheckPoint,即合并edits和fsimage
                         CheckPoint触发条件:
                                1)定时时间到(默认1小时)
                                2)edits数据满了(默认一百万条)
                2、执行CheckPoint
                3、滚动正在写的edits,即edits_inprogress_001滚动成edits_001,如果客户端现在有请求,那 么会更新到edits_inprogress_002中,这样就避免了冲突。
                4、把fsimage和edits_001拷贝到2nn中
                5、将fsimage和edits_001加载到内存并合并
                备注:这个时候可能不止有一个edits,2nn会依次把edits和fsimage合并
                6、生成新的fsimage,假定名字为fsimage.checkpoint
                7、将fsimage.checkpoint拷贝到nn中
                8、将fsimage.checkpoint重命名为fsimage;这个时候,fsimage和正在写的edits就组成了最新的元数据

附录: CheckPoint触发条件的设置

以下两个设置都是在hdfs-site.xml文件中

(1)通常情况下,SecondaryNameNode每隔一小时执行一次。

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

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

<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 >

Datanode 的工作机制

1、数据块在DataNode上以文件的形式存储在磁盘上,包括两个文件。一个文件是数据,另一个是元数据包含数据块的长度、时间戳、校验和 2、DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息 3、心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。默认如果超过10分钟30秒没有收到某个DataNode的心跳,则认为该节点不可用,图中10分钟超时写错了

补充:

将超时时间定义为

TimeOut
,根据公式可以算出超时时间为10分钟30秒

两个参数的设置在hdfs-site.xml中,
dfs.namenode.heartbeat.recheck-interval
单位是毫秒
dfs.heartbeat.interval
单位是秒

<property>
<name>dfs.namenode.heartbeat.recheck-interval</name>
<value>300000</value>
</property>
<property>
<name>dfs.heartbeat.interval</name>
<value>3</value>
</property>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: