NameNode元数据解析
- 第一次启动 NameNode 格式化后,创建 FSimage 和 Edits 文件。如果不是第一次启动,直接加载 Edits 和 FSimage 文件到内存。
- 客户端对元数据进行增删改的请求。
- NameNode 记录操作日志,更新滚动日志。
- NameNode 在内存中对数据进行增删改查
FSimage 保存了最新的元数据检查点,在 HDFS 启动时加载 FSimage 的信息,包含了整个HDFS文件系统的所有目录和文件的信息。
1)对于文件来说包括了数据块描述信息、修改时间、访问时间等。
2)对于目录来说包括修改时间、访问权限控制信息(目录所属用户,所在组)等。
Editlog 主要是在 NameNode 已经启动情况下对 HDFS 进行的各种更新操作进行记录,HDFS 客户端执行所有的写操作都会被记录袋 Editlog 中。
FSimage,Editlog 主要用于在集群启动时将集群的状态恢复到关闭前的状态。
为了达到这目的,集群启动时将 FSimage、Editlog 加载到内存中,进行合并,合并后恢复完成。
元数据信息目录的配置
hdfs-site.xml当中
<property>
<name>dfs.namenode.name.dir</name>
<value>
file:///export/servers/Hadoop-2.6.0-cdh5.14.0/HadoopDatas/namenodeDatas
</value>
</property>
<property>
<name>dfs.namenode.edits.dir</name>
<value>
file:///export/servers/Hadoop-2.6.0-cdh5.14.0/HadoopDatas/dfs/nn/edits
</value>
</property>
FSimage文件当中的文件信息查看
使用命令 hdfs oiv
cd /export/servers/Hadoop-2.6.0-cdh5.14.0/HadoopDatas/namenodeDatas/current
hdfs oiv -i fsimage_0000000000000000864 -p XML -o hello.xml
edits当中的文件信息查看
cd /export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/dfs/nn/edits/current
hdfs oev -i edits_0000000000000000865-0000000000000000866 -o myedit.xml -p XML
secondarynameNode如何辅助管理FSImage与Edits文件
由于 Editlog 记录了集群运行期间所有对 HDFS 的相关操作,所以这个文件会很大。
集群关闭后再次启动时会将 FSimage,Editlog 加载到内存中,进行合并,恢复到集群上次关机前的状态的。
由于 Editlog 文件很大所有,集群再次启动时会花费较长时间。
为了加快集群的启动时间,所以使用 secondaryNameNode 辅助 NameNode 合并 FSimage,Editlog。
- seconnaryNameNode 通知 NameNode 切换 Editlog
- secondaryNameNode 从 NameNode 中获取 FSimage 和 Editlog(通过http关系)
- secondaryNameNode 将 FSimage 载入内存,然后开始合并 Editlog,合并之后成为新的 FSimage
- secondaryNameNode 将新的 FSimage 发回给 NameNode
- 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合并一次。
第二个参数是hdfs操作次数达到1000000 也会触发合并
第一个参数:时间达到一个小时fsimage与edits就会进行合并
dfs.namenode.checkpoint.period :3600
第二个参数:hdfs操作达到1000000次也会进行合并
dfs.namenode.checkpoint.txns :1000000
还有一个参数是每隔多长时间检查一次hdfs的操作次数
dfs.namenode.checkpoint.check.period :60
namenode元数据信息多目录配置
为了保证元数据的安全性,我们一般都是先确定好我们的磁盘挂载目录,将元数据的磁盘做 RAID1
NameNode 的本地目录可以配置成多个,且每个目录存放内容相同,增加了可靠性。
具体配置如下:
hdfs-site.xml
<property>
<name>dfs.namenode.name.dir</name>
<value>
file:///export/servers/Hadoop-2.6.0-cdh5.14.0/HadoopDatas/namenodeDatas
</value>
</property>