NameNode 主要负责集群当中的元数据信息管理,而且元数据信息需要经常被随机访问,所以元数据信息必须支持快速检索,那么如何保证 NameNode 快速检索呢?元数据信息保存在哪里能够快速检索呢?又如何保证元数据的持久安全呢?
为了保证元数据信息能够被快速检索,必须将元数据存放在内存当中,因为在内存当中元数据信息能够最快速的检索,但是随着元数据信息的增多(每个 block 块大概占用150字节的元数据信息),内存的消耗也会越来越多。
如果所有的元数据信息都存放在内存当中,当服务器断电,内存中的所有数据都将会消失,为了保证元数据的安全持久,元数据信息必须做可靠的持久化。在 Hadoop 当中为了持久化存储元数据信息,将所有的元数据信息保存在了 FSImage 文件当中,那么FSImage随着时间推移,必然会越来越膨胀,操作 FSImage 也变得越来越难。为了解决元数据信息的增删改,Hadoop 当中还引入元数据操作日志 edits 文件,edits 文件记录了客户端操作元数据的信息,随着时间的推移,edits 信息也会越来越大,为了解决edits 文件膨胀的问题,Hadoop 中引入了 SecondaryNameNode 来专门做 FSImage 与 edits 文件的合并。
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 。
FSImage 与 edits 详解所有的元数据信息都保存在了FsImage与Eidts文件当中,元数据信息的保存目录配置在了hdfs-site.xml当中
dfs.namenode.name.dir
file:///kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/namenodeDatas
dfs.namenode.edits.dir
file:///kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/dfs/nn/edits
客户端对hdfs进行写文件时会首先被记录在edits文件中,edits修改时元数据也会更新。每次hdfs更新时edits先更新后,客户端才会看到最新信息。
fsimage是namenode中关于元数据的镜像,一般称为检查点。一般开始时对namenode的操作都放在edits中,为什么不放在fsimage中呢?因为fsimage是namenode的完整的镜像,内容很大,如果每次都加载到内存的话生成树状拓扑结构,这是非常耗内存和CPU。
fsimage内容包含了namenode管理下的所有datanode中文件及文件block及block所在的datanode的元数据信息。随着edits内容增大,就需要在一定时间点和fsimage合并。
FSimage文件当中的文件信息查看
官方查看文档
http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.14.2/hadoop-project-dist/hadoop-hdfs/HdfsImageViewer.html
使用命令 hdfs oiv
cd /kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/namenodeDatas/current
hdfs oiv -i fsimage_0000000000000000864 -p XML -o hello.xml
edits当中的文件信息查看
官方查看文档
http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.14.2/hadoop-project-dist/hadoop-hdfs/HdfsEditsViewer.html
查看命令 hdfs oev
cd /kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/dfs/nn/edits
hdfs oev -i edits_0000000000000000865-0000000000000000866 -o myedit.xml -p XML
SecondarynameNode 如何辅助管理 FSImage 与 Edits 文件
①:secnonaryNN通知NameNode切换editlog
②:secondaryNN从NameNode中获得FSImage和editlog(通过http方式)
③:secondaryNN将FSImage载入内存,然后开始合并editlog,合并之后成为新的fsimage
④:secondaryNN将新的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。同时会更新fstime。
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
dfs.namenode.name.dir
file:///kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/namenodeDatas
NameNode故障恢复
在我们的 SecondaryNameNode对NameNode当中的fsimage和edits进行合并的时候,每次都会先将NameNode的fsimage与edits文件拷贝一份过来,所以 fsimage 与 edits 文件在 SecondarNameNdoe当中也会保存有一份,如果 NameNode的fsimage与edits文件损坏,那么我们可以将SecondaryNameNode当中的fsimage与edits拷贝过去给NameNode继续使用,只不过有可能会丢失一部分数据。这里涉及到几个配置选项。
NameNode保存fsimage的配置路径
dfs.namenode.name.dir
file:///kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/namenodeDatas
NameNode保存edits文件的配置路径
dfs.namenode.edits.dir
file:///kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/dfs/nn/edits
SecondaryNameNode保存fsimage文件的配置路径
dfs.namenode.checkpoint.dir
file:///kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/dfs/snn/name
SecondaryNameNode保存edits文件的配置路径
dfs.namenode.checkpoint.edits.dir
file:///kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/dfs/nn/snn/edits
NameNode 故障恢复
如果NameNode当中的fsimage文件损坏或者丢失,我们可以从SecondaryNamenode当中拷贝过去放到对应的路径下即可。
第一步:杀死namenode进程
使用jps查看namenode进程号,然后直接使用kill -9 进程号杀死 NameNode 进程。
[hadoop@node01 servers]# jps
127156 QuorumPeerMain
127785 ResourceManager
17688 NameNode
127544 SecondaryNameNode
127418 DataNode
128365 JobHistoryServer
19036 Jps
127886 NodeManager
[hadoop@node01 servers]# kill -9 17688
第二步:删除namenode的fsimage与edits文件
namenode所在机器执行以下命令,删除fsimage与edits文件
删除fsimage与edits文件
rm -rf /kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/namenodeDatas/*
rm -rf /kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/dfs/nn/edits/*
第三步:拷贝secondaryNamenode的fsimage与edits文件到namenode的fsimage与edits文件夹下面去
将secondaryNameNode所在机器的fsimage与edits文件拷贝到namenode所在的fsimage与edits文件夹下面去
由于我的SecondaryNameNode与NameNode安装在同一台机器,都在node01上面,node01执行以下命令进行拷贝
cp -r /kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/dfs/snn/name/* /kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/namenodeDatas/
cp -r /kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/dfs/nn/snn/edits/* /kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/dfs/nn/edits
第四步:启动namenode
node01服务器执行以下命令启动 NameNode
cd hadoop-2.6.0-cdh5.14.2/
sbin/hadoop-daemon.sh start namenode
第五步:浏览器页面正常访问
http://node01:50070/explorer.html#/
作者:海恋北斗星