NameNode、SecondryNameNode和DataNode工作机制

这里先补充一下什么是元数据

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>
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值