一、HDFS存储数据的机制简介
HDFS
存储元数据(meta data)
的时候
结果,记录在fsImage
文件里
过程,记录在Edits
文件里
同时fsImage+Edits=最终结果
,这个最终结果(fsImage+Edits
)会保存一份在内存中,为了提升性能
大家都知道,内存计算是最快的!
就有点像Redis
的RDB和AOF持久化
。
RDB是将某个时间点上Redis中的数据以快照的形式保存在硬盘中,它是以完整的数据角度进行持久化;
AOF是通过记录每一个写操作并追加到文件中进行持久化,它是以日志的形式记录完整的写入操作。
问题来了,我们在启动Hadoop
的时候,会把结果加载到内存中,用于后面的计算。
用Edits
来记录操作过程,那么,在关停服务的时候,合并Edits
结果到fsImage
中,
消耗的时间就非常多!!!
这样肯定不行。
这时候,就需要SecondaryNameNode
来帮忙处理,当Edits
达到一定界限时,就进行一次fsImage
合并
二、服务器查看
102
上查看NameNode
文件情况
104上查看SecondaryNameNode
文件情况
对比两者区别,会发现,NN
节点比2NN
节点多了一个edits_inprogress_xxxxxxx
文件。
三、NameNode和SecondaryNameNode的工作机制
1、工作流程图
2、流程讲解
2.1、NameNode工作时机
1、第一次启动NameNode
格式化后,创建Fsimage
和Edits
文件。如果不是第一次启动,直接加载已有的Fsimage
和Edits
到内存。
2、客户端发起对元数据进行增删改的请求。
3、NameNode
记录操作日志,更新edits_inprogress_xxxxxxx
文件。
4、NameNode
更新内存中的元数据。
2.3、SecondaryNameNode工作时机
1、SecondaryNameNode
发起询问请求,是否需要CheckPoint
,NameNode
直接返回是否CheckPoint
的需求。
这个请求触发条件有两个
触发时间到了,默认是60min
一次,进行一次CheckPoint
。
edits
操作次数达到100万次
时,进行一次CheckPoint
。(这个是1分钟2NN去检查一次NN的edits
)
2、如果,返回需要执行CheckPoint
,则SecondaryNameNode
在次请求执行CheckPoint
。
3、NameNode
滚动正在编辑的edits_inprogress_xxxxxxx
文件,更新为edits_001
,并生成一个新的edits_inprogress_002
文件。
4、SecondaryNameNode
拷贝edits_001
和Fsimage
到自己所在节点机器上。
5、SecondaryNameNode
加载edits_001
和Fsimage
到内存,进行合并操作,计算出最终结果。
6、SecondaryNameNode
上,生成新的镜像文件fsimage.chkpoint
文件。
7、拷贝fsimage.chkpoint
文件到NameNode
节点上。
8、NameNode
将fsimage.chkpoint
重新命名为fsimage
文件,覆盖原有的fsimage
文件。
四、总结
通过上面的流程讲解,我们可以知道,SecondaryNameNode
上永远没有edits_inprogress_xxxxxxx
文件,所以,当NameNode
宕机时,SecondaryNameNode
是无法代替NameNode
进行工作的。
只能辅助帮助恢复元数据
,但是可以修复大量的元数据
。
补充:
1、CheckPoint
检查时间配置
hdfs-default.xml
文件,默认是3600s
一次。
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600s</value>
<description>
The number of seconds between two periodic checkpoints.
Support multiple time unit suffix(case insensitive), as described
in dfs.heartbeat.interval.
</description>
</property>
2、2NN
检查edits
中的操作次数
hdfs-default.xml
文件
<property>
<name>dfs.namenode.checkpoint.txns</name>
<value>1000000</value>
<description>The Secondary NameNode or CheckpointNode will create a checkpoint
of the namespace every 'dfs.namenode.checkpoint.txns' transactions, regardless
of whether 'dfs.namenode.checkpoint.period' has expired.
</description>
</property>
<property>
<name>dfs.namenode.checkpoint.check.period</name>
<value>60s</value>
<description>The SecondaryNameNode and CheckpointNode will poll the NameNode
every 'dfs.namenode.checkpoint.check.period' seconds to query the number
of uncheckpointed transactions. Support multiple time unit suffix(case insensitive),
as described in dfs.heartbeat.interval.
</description>
</property>
注意:
另外,这个作为了解知识,因为在实际的企业中,保证集群的高可用,不用2NN
来实现。一句话,时机生产中,2NN
不适用!!!