对未来真正的慷慨,是把一切献给现在
NameNode 和 SecondaryNameNode 工作机制
第一阶段:NameNode 启动
(1)第一次启动 NameNode 格式化后,创建Fsimage 和 Edits 文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
Fsimage 文件(镜像文件):HDFS 文件系统元数据的一个永久性的检查点,其中包含 HDFS 文件系统的所有目录和文件 idnode 的序列化信息。
Edits 文件(编辑日志):存放 HDFS 文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到 edits 文件中。
(2)客户端对元数据进行增删改的请求。
(3)NameNode 记录操作日志,更新滚动日志。
【日志是为了到时候重启的时候恢复 HDFS】
【可以手动滚动日志 hdfs dfsadmin -rollEdits】
(4)NameNode 在内存中对数据进行增删改。
第二阶段:Secondary NameNode 工作
(1)Secondary NameNode 询问 NameNode 是否需要 CheckPoint。直接带回 NameNode 是否检查结果。(2)Secondary NameNode 请求执行 CheckPoint。(3)NameNode 滚动正在写的 Edits 日志。(4)将滚动前的编辑日志和镜像文件拷贝到 Secondary NameNode。(5)Secondary NameNode 加载编辑日志和镜像文件到内存,并合并。(6)生成新的镜像文件 fsimage.chkpoint。(7)拷贝 fsimage.chkpoint 到 NameNode。(8)NameNode 将 fsimage.chkpoint 重新命名成 fsimage。
由于 Edits 中记录的操作会越来越多,Edits 文件会越来越大,导致 NameNode 在启动加载 Edits 时会很慢,所以需要对 Edits 和 Fsimage 进行合并(所谓合并,就是将 Edits 和 Fsimage 加载到内存中,照着 Edits 中的操作一步步执行,最终形成新的 Fsimage)。SecondaryNameNode 的作用就是帮助 NameNode 进行 Edits 和 Fsimage 的合并工作。
SecondaryNameNode 首先会询问 NameNode是否需要 CheckPoint(触发 CheckPoint 需要满足两个条件中的任意一个,定时时间到和 Edits 中数据写满了)。直接带回 NameNode 是否检查结果。SecondaryNameNode 执行 CheckPoint 操作,首先会让 NameNode 滚动 Edits 并生成一个空的 edits.inprogress,滚动 Edits 的目的是给 Edits 打个标记 ,以后所有新的操作都写入 edits.inprogress,其他未合并的 Edits 和 Fsimage 会拷贝到 SecondaryNameNode 的本地,然 后将拷贝的 Edits 和 Fsimage 加载到内存中进行合并,生成 fsimage.chkpoint,然后将 fsimage.chkpoint 拷贝给 NameNode,重命名为 Fsimage 后替换掉原来的 Fsimage。NameNode 在启动时就只需要加载之前未合并的 Edits 和 Fsimage 即可,因为合并过的 Edits 中的元数据信息已经被记录在 Fsimage 中。
Fsimage 镜像文件和 Edits 编辑日志解析
oiv 查看 Fsimage 镜像文件
使用 oiv 命令,语法如下:
hdfs oiv -p 文件类型 - i 镜像文件 -o 转换后文件输出路径
hdfs oiv -p XML -i fsimage_0000000000000000025 -o /opt/module/hadoop-2.7.2/fsimage.xml
oev 查看 Edits 编辑日志文件
使用 oev 命令,语法如下:
hdfs oev -p 文件类型 - i 编辑日志 -o 转换后文件输出路径
hdfs oev -p XML -i edits_0000000000000000012-0000000000000000013 -o /opt/module/hadoop-2.7.2/edits.xml
CheckPoint 时间设置
触发 SecondaryNameNode 执行 checkpoint 保存数据的条件有两种:时间和次数
【1】通常 SNN 每隔一小时执行一次,配置 hdfs-default.xml
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
</property >
【2】当操作次数达到 100 完次时候
<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 >
相关资料
本文配套GitHub:https://github.com/zhutiansam…