fsimage和edits详解
-
edits
edits存放的是HDFS最近一段时间的修改日志,客户端对HDFS的操作首先会被记录到edits,然后namenode的元数据也会更新。
-
fsimage
fsimage是namenode元数据的备份,可以理解为是namenode的checkpoint。
因为NameNode的元数据是存储在内存中的,所以每次NameNode重启或者是启动的时候都会先导入fsimage然后按照edits执行一遍,得到目前的文件系统的元数据信息。注意:上述过程中HDFS会进入安全模式,安全模式下HDFS只允许读不允许修改,当读副本率大于99.99%,HDFS就认为已经把所有数据都装载完了,就会自动离开安全模式。
这两个文件的路径可以自己配置,在core-site.xml文件中,添加如下配置即可:
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///export/servers/hadoop2.7.5/hadoopDatas/namenodeDatas, file:///export/servers/hadoop2.7.5/hadoopDatas/namenodeDatas2</value>
</property>
<property>
<name>dfs.namenode.edits.dir</name> <value>file:///export/servers/hadoop2.7.5/hadoopDatas/nn/edits</value>
</property>
SecondaryNamenode辅助管理元数据
在Hadoop2.X中引入了SecondaryNameNode,在生产环境中,这个节点一般不会和NameNode部署在同一个节点。SecondaryNamenode的引入,是为了给NameNode减轻负担,辅助NameNode管理元数据信息的。其工作原理如下图:
SecondaryNamenode工作原理详解:
fsimage要同步edits文件的会有一个触发点,到底什么时候SecondaryNamenode就要合并这两个文件了?这个可以自己配置,也有默认的参数。默认是距离上一次合并已经经过一个小时了,或者edits文件大小已经达到64MB了。这两个条件任何一个成立就会触发secondarynamenode合并元数据文件。如果需要设置其他参数的话,可以在core-site.xml文件里面进行如下配置:
<!-- 多久记录一次 HDFS 镜像, 默认 1小时 -->
<property>
<name>fs.checkpoint.period</name>
<value>3600</value>
</property>
<!-- 一次记录多大, 默认 64M -->
<property>
<name>fs.checkpoint.size</name>
<value>67108864</value>
</property>
达到触发点之后,secondarynamenode就开始工作了:
1.先去namenode拉取edit和fsimage
2.secondarynamenode根据edits执行一遍得到最新的fsimage.ckpt并返回给namenode
3.namenode拿到fsimage.ckpt就会把它替换为fsimage,并将edits清空
4.通过上述步骤,NameNode就更新了edits和fsimage