天天看点

HDFS的NameNode和SecondaryNameNode功能剖析

1. namenode与secondaryName解析

  • NameNode主要负责集群当中的元数据信息管理,而且元数据信息需要经常随机访问,因为元数据信息必须高效的检索
    • 元数据信息保存在哪里能够快速检索呢?
    • 如何保证元数据的持久安全呢?
  • 为了保证元数据信息的快速检索,那么我们就必须将元数据存放在内存当中,因为在内存当中元数据信息能够最快速的检索,那么随着元数据信息的增多(每个block块大概占用150字节的元数据信息),内存的消耗也会越来越多。
  • 如果所有的元数据信息都存放内存,服务器断电,内存当中所有数据都消失,为了保证元数据的安全持久,元数据信息必须做可靠的持久化
  • 在hadoop当中为了持久化存储元数据信息,将所有的元数据信息保存在了FSImage文件当中,那么FSImage随着时间推移,必然越来越膨胀,FSImage的操作变得越来越难,为了解决元数据信息的增删改,hadoop当中还引入了元数据操作日志edits文件,edits文件记录了客户端操作元数据的信息,随着时间的推移,edits信息也会越来越大,为了解决edits文件膨胀的问题,hadoop当中引入了secondaryNamenode来专门做fsimage与edits文件的合并
HDFS的NameNode和SecondaryNameNode功能剖析
HDFS的NameNode和SecondaryNameNode功能剖析
  1. namenode工作机制

    (1)第一次启动namenode格式化后,创建fsimage和edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。

    (2)客户端对元数据进行增删改的请求

    (3)namenode记录操作日志,更新滚动日志。

    (4)namenode在内存中对数据进行增删改查

  2. 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

属性 解释
dfs.namenode.checkpoint.period 3600秒(即1小时) The number of seconds between two periodic checkpoints.
dfs.namenode.checkpoint.txns 1000000 The Secondary NameNode or CheckpointNode will create a checkpoint of the namespace every ‘dfs.namenode.checkpoint.txns’ transactions, regardless of whether ‘dfs.namenode.checkpoint.period’ has expired.
dfs.namenode.checkpoint.check.period 60秒(1分钟) The SecondaryNameNode and CheckpointNode will poll the NameNode every ‘dfs.namenode.checkpoint.check.period’ seconds to query the number of uncheckpointed transactions.

2. FSImage与edits详解

  • 所有的元数据信息都保存在了FsImage与Eidts文件当中,这两个文件就记录了所有的数据的元数据信息,元数据信息的保存目录配置在了hdfs-site.xml当中
<!-- fsimage目录 -->
<property>
  <name>dfs.namenode.name.dir</name>
  <value>file:///kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/namenodeDatas</value>
</property>
<!-- edit文件目录 -->
<property>
   <name>dfs.namenode.edits.dir</name>
   <value>file:///kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/dfs/nn/edits</value>
</property>
           
  • 客户端对hdfs进行写文件时会首先被记录在edits文件中

    edits修改时元数据也会更新。

    每次hdfs更新时edits先更新后,客户端才会看到最新信息。

    fsimage:是namenode中关于元数据的镜像,一般称为检查点。

    一般开始时对namenode的操作都放在edits中,为什么不放在fsimage中呢?

    因为fsimage是namenode的完整的镜像,内容很大,如果每次都加载到内存的话生成树状拓扑结构,这是非常耗内存和CPU。

    fsimage内容包含了namenode管理下的所有datanode中文件及文件block及block所在的datanode的元数据信息。随着edits内容增大,就需要在一定时间点和fsimage合并。

3. FSimage文件当中的文件信息查看

  • 官方查看文档
  • 使用命令 hdfs oiv
cd  /kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/namenodeDatas/current
hdfs oiv    #查看帮助信息
hdfs oiv -i fsimage_0000000000000000864 -p XML -o /home/hadoop/fsimage1.xml
           

4. edits当中的文件信息查看

  • 官方查看文档
  • 查看命令 hdfs oev
cd /kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/dfs/nn/edits/current
hdfs oev     #查看帮助信息
hdfs oev -i edits_0000000000000000865-0000000000000000866 -o /home/hadoop/myedit.xml -p XML
           

5. namenode元数据信息多目录配置

  • 为了保证元数据的安全性
    • 我们一般都是先确定好我们的磁盘挂载目录,将元数据的磁盘做RAID1 namenode的本地目录可以配置成多个,且每个目录存放内容相同,增加了可靠性。
    • 多个目录间逗号分隔
  • 具体配置如下:

    hdfs-site.xml

<property>
   <name>dfs.namenode.name.dir</name>
   <value>file:///kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/namenodeDatas,file:///path/to/another/</value>
</property>
           

继续阅读