NameNode
简称为NN
,SecondaryNameNode
简称为2NN
NameNode
中有元数据,那么元数据是存在什么地方呢?
如果元数据存储在NN
的内存中,内存有两个特点就是:不可靠(断电即失)、计算速度快;这样保证不了数据的可靠性,一旦断电、元数据丢失,整个集群就无法工作了
如果元数据存储在NN
的硬盘中,硬盘的特点是:可靠、计算速度慢;这样虽然保证了数据的可靠性,但是它的计算速度就慢了。
因此HDFS
采用了内存 + 磁盘
的方式,并且引入了两个概念FsImage与Edits
:FsImage
负责存储数据;Edits
负责追加内容(不计算)。每当元数据有更新或者或者添加元数据时,修改内存中的元数据并追加到Edits
中。 这样,一旦NN
节点断电,就可以通过FsImage
和Edits
的合并,合成元数据。
但是随着Edits
文件数据过大,它的效率降低,一旦断电、恢复元数据的时间也过长,因此需要定期进行FsImage
和Edits
的合并,这个工作如果只有NN
做,又会效率过低。所以引入一个新的节点2NN
专门用于FsImage
和Edits
的合并。
下面一张图解释了NN
和2NN
的工作机制:
它分为两个阶段:
第一阶段:NameNode
启动:
- 第一次启动
NN
格式化后,创建FsImage
和Edits
文件,如果不是第一次启动,直接加载FsImage
和Edits
到内存 - 客户端对元数据进行增删改的请求
NN
的Edits
记录操作日志,更新滚动日志NN
在内存中对元数据进行增删改
第二阶段:Secondary NameNode
工作:
2NN
会定期或当Edits
数据满的时候询问NN
是否需要CheckPoint
(检查是否需要合并)2NN
请求执行CheckPoint
NN
滚动正在写的Edits
日志- 然后将滚动前的编辑日志和镜像文件拷贝到
2NN
2NN
加载编辑日志和镜像文件到内存,并合并- 生成新的镜像文件
fsimage.chkpoint
- 拷贝
fsimage.chkpoint
到NN
NN
将fsimage.chkpoint
重新命名为fsimage
我们可以查看NN
所在的hadoop102
和2NN
所在的hadoop104
他们的fsimage
和edits
文件:
hadoop102
路径:/opt/module/hadoop-3.1.3/data/dfs/name/current
hadoop104
路径:/opt/module/hadoop-3.1.3/data/dfs/namesecondary/current
可以发现NN
比2NN
多一个文件edits_inprogress...
,如果NN
宕机,那么2NN
可以帮助恢复NN
元数据,但是只能恢复一部分,缺少的部分正是该文件。该文件存储的是正在执行的操作
文件解读:
Fsimage文件
:HDFS
文件系统元数据的一个永久性的检查点,其中包含HDFS
文件系统的所有目录和文件inode
的序列化信息Edits
文件:存放HDFS
文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到Edits
文件中seen_txid
文件保存的是一个数字,就是最后一个edits_
的数字- 每次
NN
启动的时候都会将Fsimage
文件读入内存,加载Edits
里面的更新操作,保证内存中的元数据信息是最新的、同步的,可以看成NN
启动的时候就将Fsimage
和Edits
文件进行了合并
语法:
hdfs oiv -p 文件类型 -i 镜像文件 -o 转换后文件输出路径
现在使用这个命令查看一下fsimage_0000000000000000394
:
hdfs oiv -p XML -i fsimage_0000000000000000394 -o /opt/software/fsimage.xml
执行完成之后,会输出一个文件
下载到桌面:
sz fsimages.xml
打开之后:
语法:
hdfs oev -p 文件类型 -i 编辑日志 -o 转换后文件输出路径
现在使用这个命令查看一下edits_inprogress...
hdfs oev -p XML -i edits_inprogress_0000000000000000398 -o /opt/software/edits.xml
sz edits.xml
因为现在没有执行任何操作,这个文件还是挺干净的:
通常情况下2NN
每隔一个小时执行一次检查,可以查看hdfs-default.xml
:
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600s</value>
</property>
当操作数达到一百万,2NN
执行一次:
<property>
<name>dfs.namenode.checkpoint.txns</name>
<value>1000000</value>
<description>操作动作次数</description>
</property>
<property>
<name>dfs.namenode.checkpoint.check.period</name>
<value>60s</value>
<description> 1 分钟检查一次操作次数</description>
</property>
如果想要更换时间或者更改操作数,可以配置到hdfs-site.xml