NN和2NN工作机制
NameNode中的元数据是存储在哪里?
元数据存在镜像文件Fsimage和编辑日志Edist文件中。在Secondary NameNode节点中,会定期进行Fsimage和Edits的拷贝与合并,保证元数据的更新。
1.假设存储在NameNode节点的磁盘中,因为要经常进行随机访问和响应客户请求,看起来效率过低;那应该是在内存中;
2.假设只存放在内存中,一旦断电,元数据丢失,整个集群便无法工作;
3.因此应该是在存在磁盘中备份元数据的Fsimage中
;但当内存中的元数据更新时,如果同时更新Fsiamge,就会导致效率过低,但如果不更新,就会产生一致性问题,一旦NameNode节点断电,就会产生数据丢失;
4.所以还要引入Edits文件(只进行追加操作,效率高)
,每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中。
这样,当NameNode节点断电时,可以通过Fsimage和Edits的合并,合成元数据。
5.但如果长时间添加数据到Edits种,会导致该文件数据过大,效率降低,一旦断电,恢复元数据需要的时间过长。
所以,需要定期进行Fsimage和Edits的合并
,如果此操作由NameNode节点完成,效率过低;所有,再次引入一个新的节点Secondary NameNode,专门用于Fsimage和Edits的合并。
第一阶段
1.第一次启动NameNode格式化后,创建Fsimage和Edits文件;
若非第一次启动,直接加载编辑日志Edits和镜像文件Fsimage到内存;
2.客户端对元数据进行增删改的请求;
3.NameNode记录操作日志,更新滚动日志;
4.NameNode在内存中对元数据进行增删改。
第二阶段
1.Secondary NameNode询问NameNode是否需要CheckPoint(定时1hr);
2.Secondary NameNode请求执行CheckPoint (1min查看一次nn/ 磁盘已满);
3.NameNode滚动正在写的Edits日志;生成新的edits_inprogress_002, 将原来的名称修改为edits_001;
4.将滚动前的编辑日志edits_001和镜像文件fsimage拷贝到Secondary NameNode;
5.Secondary NameNode加载编辑日志edits_001和镜像文件fsimage到内存,并合并;
6.生成新的镜像文件fsimage.chkpoint;
7.拷贝fsimage.chkpoint到NameNode;
8.NameNode将fsimage.chkpoint重新命名成fsimage(覆盖)。
tips:
1.NameNode和Secondary NameNode的唯一区别:NameNode中记录了最新的edits_inprogress_002操作;
2.最新的元数据 = fsimage + edits_inprogress_002,每次启动NameNode的时候,都会加载一次fsimage + edits_inprogress_002,保证内存中的元数据是最新的。
Fsimage和Edits解析
Fsimage和Edits概念
NameNode被格式化之后,将在/opt/module/hadoop-3.2.2/data/dfs/name/current目录下产生如下文件:
[xiaobai@hadoop102 current]$ pwd
/opt/module/hadoop-3.2.2/data/dfs/name/current
1.Fsimage文件:HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目录和文件inode的序列化信息;
2.Edits文件:存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到Edits文件中;
3.seen_exid文件保存的是一个数字,就是最后一个edits_的数字(最新的edits文件);
4.每次NameNode启动的时候都会将Fsimage文件读入内存,家在Edits里面的更新操作,保证内存中的元数据信息是最新的、同步的,可以看成NameNode启动的时候就将Fsimage和Edits文件进行了合并。
oiv查看Fsimage文件
1.查看oiv和oev命令:
oiv: 查看镜像文件;
oev: 查看Edits文件;
[xiaobai@hadoop102 current]$ hdfs
oev apply the offline edits viewer to an edits file
oiv apply the offline fsimage viewer to an fsimage
2.基本语法:
hdfs oiv -p 文件类型 -i 镜像文件 -o 转换后文件输出路径
3.案例
[xiaobai@hadoop102 current]$ hdfs oiv -p XML -i fsimage_0000000000000003207 -o /opt/software/fsimage.xml
2021-09-02 22:43:53,417 INFO offlineImageViewer.FSImageHandler: Loading 5 strings
2021-09-02 22:43:53,517 INFO namenode.FSDirectory: GLOBAL serial map: bits=29 maxEntries=536870911
2021-09-02 22:43:53,518 INFO namenode.FSDirectory: USER serial map: bits=24 maxEntries=16777215
2021-09-02 22:43:53,518 INFO namenode.FSDirectory: GROUP serial map: bits=24 maxEntries=16777215
2021-09-02 22:43:53,518 INFO namenode.FSDirectory: XATTR serial map: bits=24 maxEntries=16777215
将显示的xml文件内容拷贝到/opt/software/目录下创建的fsimage.xml文件中
oev查看Edits文件
1.基本语法
hdfs oev -p 文件类型 -i 编辑日志 -o 转换后文件输出路径
2.案例
[xiaobai@hadoop102 current]$ hdfs oev -p XML -i edits_inprogress_0000000000000003208 -o /opt/software/edits.xml
问:NameNode如何确定下次开机启动的时候合并哪些Edits?
合并数字最大的,时间戳最晚的。
CheckPoint时间设置
1.通常情况下,Secondary NameNode每隔1hr执行一次;
2.1min检查一次操作次数,当操作次数达到1百万次时,Secondary NameNode执行一次。
tips: 可在hdfs-default.xml中查看。