HDFS NameNode和SecondaryNameNode
一:NN 和 2NN 工作机制
1.1 思考:NameNode 中的元数据是存储在哪里的?
首先,我们做个假设,如果存储在 NameNode 节点的磁盘中,因为经常需要进行随机访 问,还有响应客户请求,必然是效率过低。因此,元数据需要存放在内存中。但如果只存在 内存中,一旦断电,元数据丢失,整个集群就无法工作了。因此产生在磁盘中备份元数据的 FsImage。
这样又会带来新的问题,当在内存中的元数据更新时,如果同时更新 FsImage,就会导 致效率过低,但如果不更新,就会发生一致性问题,一旦 NameNode 节点断电,就会产生数 据丢失。因此,引入 Edits 文件(只进行追加操作,效率很高)。每当元数据有更新或者添 加元数据时,修改内存中的元数据并追加到 Edits 中。这样,一旦 NameNode 节点断电,可 以通过 FsImage 和 Edits 的合并,合成元数据。
但是,如果长时间添加数据到 Edits 中,会导致该文件数据过大,效率降低,而且一旦 断电,恢复元数据需要的时间过长。因此,需要定期进行 FsImage 和 Edits 的合并,如果这 个操作由NameNode节点完成,又会效率过低。因此,引入一个新的节点SecondaryNamenode, 专门用于 FsImage 和 Edits 的合并。
1.2 NameNode工作机制

(1)第一阶段:NameNode 启动
- 第一次启动 NameNode 格式化后,创建 Fsimage 和 Edits 文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
- 客户端对元数据进行增删改的请求。
- NameNode 记录操作日志,更新滚动日志。
- NameNode 在内存中对元数据进行增删改。
(2)第二阶段:Secondary NameNode 工作
- Secondary NameNode 询问 NameNode 是否需要 CheckPoint。直接带回 NameNode 是否检查结果。
- Secondary NameNode 请求执行 CheckPoint。
- NameNode 滚动正在写的 Edits 日志。
- 将滚动前的编辑日志和镜像文件拷贝到 Secondary NameNode。
- Secondary NameNode 加载编辑日志和镜像文件到内存,并合并。
- 生成新的镜像文件 fsimage.chkpoint。
- 拷贝 fsimage.chkpoint 到 NameNode。
- NameNode 将 fsimage.chkpoint 重新命名成 fsimage。
二:Fsimage 和 Edits 解析
2.1 Fsimage和Edits概念
NameNode被格式化之后,将在/opt/module/hadoop-3.3.4/data/tmp/dfs/name/current目录中产生如下文件

- Fsimage文件:HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目 录和文件inode的序列化信息。
- Edits文件:存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先 会被记录到Edits文件中。
- seen_txid文件保存的是一个数字,就是最后一个edits_的数字
- 每 次NameNode启动的时候都会将Fsimage文件读入内存,加 载Edits里面的更新操作,保证内存 中的元数据信息是最新的、同步的,可以看成NameNode启动的时候就将Fsimage和Edits文件进行了合并。
2.2 oiv 查看 Fsimage 文件
- hdfs oiv -p 文件类型 -i 镜像文件 -o 转换后文件输出路径
- pwd:/opt/module/hadoop-3.3.4/data/dfs/name/current
- hdfs oiv -p XML -i fsimage_0000000000000000025 -o /home/ghost/tmp/fsimage.xml
- 思考:可以看出,Fsimage 中没有记录块所对应 DataNode,为什么?
- 在集群启动后,要求 DataNode 上报数据块信息,并间隔一段时间后再次上报。
2.3 oev 查看 Edits 文件
- hdfs oev -p 文件类型 -i 编辑日志 -o 转换后文件输出路径
- pwd:/opt/module/hadoop-3.3.4/data/dfs/name/current
- hdfs oiv -p XML -i edits_0000000000000000012-0000000000000000013 -o /home/ghost/tmp/edits.xml
三 :CheckPoint 时间设置
3.1 通常情况下,SecondaryNameNode 每隔一小时执行一次
hdfs-default.xml 原始配置如下:
1 | <property> |
3.2 一分钟检查一次操作次数,当操作次数达到 1 百万时,SecondaryNameNode 执行一次。
hdfs-default.xml 原始配置如下:
1 | <property> |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 爱影客!



