HDFS集群有两类节点以管理节点-工作节点模式运行,即一个namenode(管理节点)和多个datanode(工作节点)。namenode管理文件系统的命名空间。它维护着文件系统树及整棵树内的所有文件和目录。这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件和编辑日志文件。
namenode的目录结构:
fsimage开头的文件是命名空间镜像文件,edits开头的文件是编辑日志文件。
一、镜像文件和编辑日志
namenode启动时,首先将映像文件fsimage载入内存,并执行编辑日志edits中的各项编辑操作。
1、编辑日志(edits_xxx)
存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作都会记录到edits文件中。
它在磁盘的体现是多个文件,每个文件被称为一个“段”,名称由前缀edits及后缀组成,后缀指出该文件所包含的事务id。任一时刻只有一个文件处于打开可写状态(表现为:edits_inprogress_xxx开头),每个事务完成之后,且在客户端发送成功代码之前,文件都需要更新和同步。当namenode向多个目录写数据时,只有在所有写操作都更新并同步到每个副本之后方可返回成功代码。
edits文件内容查看:
基本语法
hdfs oev -p 文件类型 -i 编辑日志 -o 转换后文件输出路径
E:\hadoop2.8.4>hdfs oev -p XML -i edits_0000000000000000030-0000000000000000042 -o E:\hadoop2.8.4\edits.xmlE:\hadoop2.8.4>
查看输出的edits.xml文件内容:
2、文件系统映像(fsimage_xxx)
HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目录和文件序列化信息。
并非每一个写操作都会更新该文件,因为fsimage是一个大型文件,如果频繁的读写会使系统运行缓慢。但是这个特性不会降低系统的恢复能力,如果namenode发生故障,还是需要将最近的fsimage文件读入内存来重构元数据的最近状态,再从相关点开始向前执行编辑日志中记录的每个事务。
oiv命令查看fsimage文件
hdfs oiv -p 文件类型 -i 镜像文件 -o 转换后文件输出路径
二、SecondaryNamenode
编辑日志不会是无限的增长的,编辑日志和映像文件需要合并,而在同一namenode来执行合并操作会耗费大量内存和计算能力,所以一般合并操作会在另一台机器上(SecondaryNamenode),即辅助节点,使用辅助节点来创建检查点:
- SecondaryNameNode请求NameNode停止使用当前打开的edits文件(即edits_inprogress_000xxx文件),并重新打开一个新的编辑日志文件以记录新的操作。
- SecondaryNameNode从NameNode中获取最近的fsimage和edits文件,使用HTTP GET方式获取。
- SecondaryNameNode将fsimage载入内存,然后逐一执行edits文件中记录的操作,然后创建一个新的镜像文件。
- SecondaryNameNode将合并后的镜像文件发送到NameNode(HTTP PUT),NameNode将其保存为一个临时文件..chkpoint文件。
- NameNode重新命名该临时的镜像文件,此为最新的镜像文件。
辅助检查点的触发条件一般受两个配置参数控制。默认情况下,
- 辅助namenode每隔一小时创建检查点(dfs.namenode.checkpoint.period(单位为秒))
- 从上一检查点开始编辑日志的大小已经达到100万个事务
(dfs.namenode.checkpoint.txns)
<property> <name>dfs.namenode.checkpoint.periodname> <value>3600value> #单位:秒 <description>The number of seconds between two periodic checkpoints. description>property><property> <name>dfs.namenode.checkpoint.txnsname> <value>1000000value> # edits事务数量 <description>文件操作次数,事务数量description>property>
SecondaryNameNode情况可通过访问http://配置的SecondaryNameNode IP:50090查看。
SecondaryNameNode配置信息位于hdfs-site.xml
<property> <name>dfs.namenode.secondary.http-addressname> <value>tian:50090value>property>
如果namenode出现故障,可以先将namenode进程关掉,然后将SecondaryNameNode中的数据复制到namenode存储数据的目录中并启动namenode。
三、namenode多目录配置
namenode的本地目录可以配置成多个,每个目录中存放的内容相同,增加可靠性。
1、在hdfs-site.xml中增加配置:
dfs.namenode.name.dir file:///${hadoop.tmp.dir}/dfs/name1,file:///${hadoop.tmp.dir}/dfs/name2
2、停止hadoop集群
3、格式化集群并启动
[root@wuxinyan bin]# hdfs namenode -format[root@wuxinyan sbin]# sh start-dfs.sh
4.查看结果
四、namenode工作流程图
第一阶段:namenode 启动
(1)第一次启动namenode 格式化后,创建fsimage 和edits 文件。如果不是第一次启
动,直接加载编辑日志和镜像文件到内存。
(2)客户端对元数据进行增删改的请求。
(3)namenode 记录操作日志,更新滚动日志。
(4)namenode 在内存中对数据进行增删改查。
第二阶段:Secondary NameNode 工作
(1)Secondary NameNode 询问namenode 是否需要checkpoint。直接带回namenode 是
否检查结果。
(2)Secondary NameNode 请求执行checkpoint。
(3)namenode 滚动正在写的edits 日志。
(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。
(5)Secondary NameNode 加载编辑日志和镜像文件到内存,并合并。
(6)生成新的镜像文件fsimage.chkpoint。
(7)拷贝fsimage.chkpoint 到namenode。
(8)namenode 将fsimage.chkpoint 重新命名成fsimage。