当 Hadoop 的集群当中, 只有一个 NameNode 的时候,所有的元数据信息都保存在了 FsImage 与 Eidts 文件当中,这两个文件就记录了所有的数据的元数据信息, 元数据信息的保存目录配置在了hdfs-site.xml
当中
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///export/servers/hadoop-3.1.1/datas/namenode/namenodedatas</value>
</property>
<property>
<name>dfs.namenode.edits.dir</name>
<value>file:///export/servers/hadoop-3.1.1/datas/dfs/nn/edits</value>
</property>
edits
edits
存放了客户端最近一段时间的操作日志edits
文件中edits
修改时元数据也会更新edits
先更新后客户端才会看到最新信息fsimage
fsimage
存放了一份比较完整的元数据信息fsimage
是 NameNode 的完整的镜像,
如果每次都加载到内存生成树状拓扑结构,这是非常耗内存和CPU,
所以一般开始时对 NameNode 的操作都放在 edits 中fsimage
内容包含了 NameNode 管理下的所有 DataNode 文件及文件
block 及 block 所在的 DataNode 的元数据信息.edits
内容增大, 就需要在一定时间点和 fsimage
合并使用命令 hdfs oiv
cd /export/servers/hadoop-3.1.1/datas/namenode/namenodedatas
hdfs oiv -i fsimage_0000000000000000864 -p XML -o hello.xml
使用命令 hdfs oev
cd /export/servers/hadoop-3.1.1/datas/dfs/nn/edits
hdfs oev -i edits_0000000000000000865-0000000000000000866 -o myedit.xml -p XML
conf/masters
中指定hdfs-site.xml
<property>
<name>dfs.http.address</name>
<value>host:50070</value>
</property>
core-site.xml
, 这一步不做配置保持默认也可以 <!-- 多久记录一次 HDFS 镜像, 默认 1小时 -->
<property>
<name>fs.checkpoint.period</name>
<value>3600</value>
</property>
<!-- 一次记录多大, 默认 64M -->
<property>
<name>fs.checkpoint.size</name>
<value>67108864</value>
</property>
SecondaryNameNode
通知 NameNode
切换 editlogSecondaryNameNode
从 NameNode
中获得 fsimage 和editlog(通过http方式)SecondaryNameNode
将 fsimage 载入内存, 然后开始合并 editlog,合并之后成为新的 fsimageSecondaryNameNode
将新的 fsimage 发回给 NameNodeNameNode
用新的 fsimage 替换旧的 fsimageedits.new
SecondaryNameNode
从 NameNode
中通过 Http GET 获得 edits, 因为要和fsimage 合并, 所以也是通过 Http Get 的方式把 fsimage 加载到内存,然后逐一执行具体对文件系统的操作, 与 fsimage 合并, 生成新的fsimage,然后通过 Http POST 的方式把 fsimage 发送给 NameNode
. NameNode
从SecondaryNameNode
获得了 fsimage 后会把原有的 fsimage 替换为新的fsimage, 把 edits.new 变成 edits. 同时会更新 fstimeSecondaryNameNode
在合并 edits 和 fsimage 时需要消耗的内存和NameNode
差不多, 所以一般把 NameNode 和 SecondaryNameNode放在不同的机器上