由于editlog记录了集群运行期间所有对HDFS的相关操作,所以这个文件会很大
集群关闭后再次启动时会将Fsimage,editlog加载到内存中,进行合并,恢复到集群上次关闭的那个状态
由于editlog文件很大,所以集群再次启动时会花费较长时间
为了加快集群的启动时间,所以使用secondarynameNode辅助NameNode合并Fsimage,editlog
原理:
1.SecondaryNameNode通知NameNode切换editlog
2.SecondaryNameNode从NameNode中获得Fsimage和editlog(通过http方式)
3.SecondaryNameNode将Fsimage载入内存,然后开始合并editlog,合并之后成为新的fsimage
4.SecondaryNameNode将新的fsimage发回给NameNode
5.NameNode用新的fsimage替换旧的fsimage
完成合并的是secondarynamenode,会请求namenode停止使用edits,暂时将新写操作放入一个新的文件中(edits.new)。secondarynamenode从namenode中通过http get获得edits,因为要和fsimage合并,所以也是通过http get的方式把fsimage加载到内存,然后逐一执行具体对文件系统的操作,与fsimage合并,生成新的fsimage,然后把fsimage发送给namenode,通过http post的方式。namenode从secondarynamenode获得fsimage后会把原有的fsimage替换为新的fsimage,把edits.new变成edits。
Hadoop进入安全模式时需要管理员使用dfsadmin的save namespace来创建新的检查点
secondarynamenode在合并edits和fsimage时需要消耗的内存和namenode差不多,所以一般把namenode和secondarynamenode放在不同的机器上
fsimage与edits的合并时机取决于两个参数:
第一个参数是默认1小时fsimage与edits合并一次
dfs.namenode.checkpoint.period :3600
第二个参数是hdfs操作次数达到1000000也会触发合并
dfs.namenode.checkpoint.txns :1000000
还有一个参数是每隔多长时间检查一次hdfs的操作次数
dfs.namenode.checkpoint.check.period :60