1、NameNode元数据的存储
Fsimage 和 Edits 文件
Fsimage 和 Edits 文件都存储在磁盘中
- Fsimage文件:HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目录和文件inode的序列化信息。
- Edits文件:存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有操作首先会被记录到Edits文件中。
说白了就是,Fsimage存放一定时间内的原始的原数据;Edits存放现在系统所有的更新操作信息。
Fsimage 和 Edits 文件的合并
启动NameNode时,都会将这两个文件进行合达到更新元数据的效果,且将合并后得到的元数据加载到内存中(具体如何实现,将在后面介绍)
NameNode启动后,每次系统进行更新操作时,追加记录到Edits中并修改内存中的元数据。
长时间添加数据到Edits中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此,需要定期进行FsImage和Edits的合并,如果这个操作由NameNode节点完成,又会效率过低。因此,引入一个新的节点SecondaryNamenode,专门用于FsImage和Edits的合并。(具体如何实现,将在后面介绍)
Checkpoint原理:
Secondary NameNode辅助NameNode节点,文件系统的写操作不是直接被修改到fsimage中,而是edits中,辅助NameNode节点负责将两者在自己的内存中整合然后进行相应的替换操作,这样会频繁的对edits进行修改而不是fsimage,而edits文件的大小是可以接受的,而且大小也不会不断增加。
总结
这种存储元数据的方式
- 效率高,不需要频繁的更新元数据;
- 安全性高,遇到突发事件时,如断电可以利用Fsimage 和 Edits 合并恢复数据。
2、NN和2NN工作机制
详细图解
详细过程
- 第一阶段:NameNode启动
(1)第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存;
(2)客户端对元数据进行增删改的请求;
(3)NameNode记录操作日志,更新滚动日志;
(4)NameNode在内存中对数据进行增删改。 - 第二阶段:Secondary NameNode工作
(1)Secondary NameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果;
(2)Secondary NameNode请求执行CheckPoint;
(3)NameNode滚动正在写的Edits日志。得到edits_ 001(包含以往的更新操作信息,用于合并)、edits_ inprogress_ 002(一个空的文件,之后的更新操作放入这个文件);
(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode;
(5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并;
(6)生成新的镜像文件fsimage.chkpoint;
(7)拷贝fsimage.chkpoint到NameNode;
(8)NameNode将fsimage.chkpoint重新命名成fsimage。
CheckPoint触发条件
-
定时时间到了
-
Edits中数据已满
# 设置 定时时间 和 操作次数 # 时间 <property> <name>dfs.namenode.checkpoint.period</name> <value>3600</value> </property> # 次数 <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 >
3、NameNode宕机恢复
采用文件拷贝方法对NameNode进行恢复,将SecondaryNameNode中数据拷贝到NameNode存储数据的目录。
下面是先将文件压缩再拷贝,也可以直接进行拷贝
- 将NameNode存储数据目录name下的内容删除;
- 进入2NN数据目录:/…/temp/dfs/namesecondary/;
- 将目录下所有文件打包成namesecondary.tar.gz并拷贝到 NN存储数据目录name下;
- 进入NN存储数据目录name下,将压缩包解压到./name目录;
- 重启NN。
在2NN下的dfs/namesecondary目录下压缩
tar -zcvf namesecondary.tar.gz ./*
在NN下拷贝
NameNode和SeconderyName
-
在同一台主机上时
cp namesecondary.tar.gz path_name_NN
-
在两台主机上时
scp -r user_2NN@host_2NN:path_2NN_namesecondary.tar.gz path_NN_name
在NN下的./name目录中解压
tar -zxvf namesecondary.tar.gz