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

第一阶段:NameNode 启动
第一次启动 NameNode 格式化后,创建 Fsimage 和 Edits 文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。 客户端对元数据进行增删改的请求。 NameNode 记录操作日志,更新滚动日志。 NameNode 在内存中对元数据进行增删改。
第二阶段:Secondary NameNode 工作
Secondary NameNode 询问 NameNode 是否需要 CheckPoint.直接带回 NameNode 是否检查结果。
Secondary NameNode 请求执行 CheckPoint
NameNode 滚动正在写的 Edits 日志。
将滚动前的编辑日志和镜像文件拷贝到 Secondary NameNode
Secondary NameNode 加载编辑日志和镜像文件拷贝到 Secondary NameNode
生成新的镜像文件 fsimage.chkpoint
拷贝 fsimage.chkpoint 到 NameNode
NameNde 将 fsimage.chkpoinit 重新命名为 fsimage
Fsimage 和 Edits 解析
NameNode 格式化后,将在数据 hadoop 的数据存储目录/tmp/dfs/name/current 目录中产生如下文件
fsimage_00000000000000 fsimage_00000000000000.md5 seen.txid VERSION
Fsimage 文件:HDFS 文件系统元数据的一个永久性的检查点,期中包含 HDFS 文件系统的所有目录和文件 inode 的序列化信息。 Edits 文件:存放 HDFS 文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到 Edits 文件中。 Seen.txid 文件保存的是一个数字,就是最后一个 edits_的数字 每次 NameNode 启动的时候都会将 Fsimage 文件读入内存,加载 Edits 里面的更新操作,保证内存中的元数据是最新的,同步的,都可以堪称 NameNode 启动的时候就将 Fsimge 和 Edits 文件进行了合并。
oiv 查看 Fsimage 文件
查看 oiv 和 oev 命令
[atguigu@hadoop102 current]$ hdfs
oiv apply the offline fsimage viewer to an fsimage
oev apply the offline edits viewer to an edits file
基本语法
hdfs oiv -p 文件类型 -i 镜像文件 -o 转换后文件输出路径
案例实操
pwd
/opt/module/hadoop-3.1.3/data/dfs/name/current
hdfs oiv -p XML -i fsimage_0000000000000000025 -o /opt/module/hadoop-3.1.3/fsimage.xml
注意:初始镜像文件是不能直接查看的 会乱码
cat /opt/module/hadoop-3.1.3/fsimage.xml
结论
在 Fsimage 中并没有记录块所对应的 DataNode,为什么?
在集群启动后,要求 DataNode 上报数据块信息,并间隔一段时间再次上报
oev 查看 Edits 文件
基本语法
hdfs oev -p 文件类型 -i 编辑日志 -o 转换后文件输出路径
案例实操
hdfs oev -p XML -i edits_0000000000000000012-0000000000000000013 -o /opt/module/hadoop-3.1.3/edits.xml
结论
NameNode 如何确定下次开机启动的时候合并哪些 Edits?
NameNode 每次会合并编号最靠后的 Edits
CheckPoint 时间设置
此类文件在默认配置文件中
通常情况下,SecondaryNameNode 每隔一小时执行一次。
hdfs-default.xmldfs.namenode.checkpoint.period 3600s 一分钟检查一次操作次数,当操作次数达到 1 百万时,SecondaryNameNode 执行一次。
dfs.namenode.checkpoint.txns 1000000 操作动作次数 dfs.namenode.checkpoint.check.period 60s 1 分钟检查一次操作次数 checkpoint为SecondNameNode询问Namenode是否需要进行合并 Fsimage 和 Edits 文件的时间点。

浙公网安备 33010602011771号