Hadoop中NameNode元数据管理机制解读

大家都知道hadoop是分布式离线批处理框架,主从架构,namenode是主节点,datanode是从节点,

hadoop整体分为:

        HDFS:分布式文件存储系统

        MapReduce:分布式离线并行计算框架

        yarn:分布式资源调度管理框架

1.元数据管理概述

  HDFS元数据,按类型分,主要包括以下几个部分:

    1、文件、目录自身的属性信息,例如文件名,目录名,修改信息等。

    2、文件记录的信息的存储相关的信息,例如存储块信息,分块情况,副本个数等。

    3、记录 HDFS Datanode 的信息,用于 DataNode 的管理。

  按形式分为内存元数据和元数据文件两种,分别存在内存和磁盘上。

  HDFS 磁盘上元数据文件分为两类,用于持久化存储:

  fsimage 镜像文件:是元数据的一个持久化的检查点,包含 Hadoop 文件系统中的所有目录和文件元数据信息,但不包含文件块位置的信息。文件块位置信息只存储在内存中,是在 datanode 加入集群的时候,namenode 询问 datanode 得到的,并且间断的更新。

  Edits 编辑日志:存放的是 Hadoop 文件系统的所有更改操作(文件创建,删除或修改)的日志,文件系统客户端执行的更改操作首先会被记录到 edits 文件中。

  fsimage edits 文件都是经过序列化的,在 NameNode 启动的时候,它会将 fsimage文件中的内容加载到内存中,之后再执行 edits 文件中的各项操作,使得内存中的元数据和实际的同步,存在内存中的元数据支持客户端的读操作,也是最完整的元数据。

  当客户端对 HDFS 中的文件进行新增或者修改操作,操作记录首先被记入 edits 日志文件中,当客户端操作成功后,相应的元数据会更新到内存元数据中。因为 fsimage 文件一般都很大,如果所有的更新操作都往 fsimage 文件中添加,这样会导致系统运行的十分缓慢。

  HDFS 这种设计实现于:一是内存中数据更新、查询快,极大缩短了操作响应时间;二是内存中元数据丢失风险颇高(断电等),因此辅佐元数据镜像文件fsimage+编辑日志文件edits的备份机制进行确保元数据的安全。

  NameNode 维护整个文件系统元数据。因此,元数据的准确管理,影响着 HDFS 提供文件存储服务的能力。

2. 元数据目录相关文件

1.首先当我们搭建好hadoop集群之后我们需要格式化namenode,以下配置文件是用来存储namenode的元数据目录

当我们格式化namenode之后会在此dfs目录下生成元数据文件

 dfs文件夹内保存的是关于namenodedatanode的信息

 data:文件夹保存的是datanode信息

name:文件夹保存的是namenode的信息

namesecondary:保存的是secondarynamenode信息

当我们格式化namenode时候我们会发现这个路径下会产生Fsimageedits文件,也就是说在格式化的时候会初始化镜像文件

fsimage edits 文件都是经过序列化的,所以我们无需查看内容。

 

namespaceID/clusterID/blockpoolID 这些都是 HDFS 集群的唯一标识符。标识符被用来防止 DataNodes 意外注册到另一个集群中的 namenode 上。这些标识在联邦(Federation)部署中特别重要。联邦模式下,会有多个 NameNode 独立工作。每个的 NameNode 提供唯一的命名空间(namespaceID),并管理一组唯一的文件块池(blockpoolID)。clusterID 将整个集群结合在一起作为单个逻辑单元,在集群中的所有节点上都是一样的。

  storageType 说明这个文件存储的是什么进程的数据结构信息(如果是 DataNode,storageType=DATA_NODE);

  cTime NameNode 存储系统创建时间,首次格式化文件系统这个属性是 0,当文件系统升级之后,该值会更新到升级之后的时间戳;

  layoutVersion 表示 HDFS 永久性数据结构的版本信息,是一个负整数。

3.SecondaryNamenode

NameNode 职责是管理元数据信息,DataNode 的职责是负责数据具体存储,那么SecondaryNameNode 的作用是什么?对很多初学者来说是非常迷惑的。它为什么会出现在HDFS 中。从它的名字上看,它给人的感觉就像是 NameNode 的备份。但它实际上却不是。

         当 HDFS 集群运行一段事件后,就会出现下面一些问题:

    edit logs 文件会变的很大,怎么去管理这个文件是一个挑战。

    NameNode 重启会花费很长时间,因为有很多改动要合并到 fsimage 文件上。

    如果 NameNode 挂掉了,那就丢失了一些改动。因为此时的 fsimage 文件非常旧。

  因此为了克服这个问题,我们需要一个易于管理的机制来帮助我们 减小 edit logs 文件的大小和得到一个最新的fsimage 文件,这样也会减小在 NameNode 上的压力。这样当系统发生问题时,我们能够回滚到最新的一次恢复点上。

  SecondaryNameNode 就是来帮助解决上述问题的,它的职责是合并 NameNode editlogs fsimage 文件中。

 

 Checkpoint

  每达到触发条件,会由 secondary namenode namenode 上积累的所有 edits 和一个最新的 fsimage 下载到本地,并加载到内存进行 merge(这个过程称为 checkpoint),如下图所示:

 

 

  • NameNode 管理着元数据信息,其中有两类持久化元数据文件:edits 操作日志文件和fsimage 元数据镜像文件。新的操作日志不会立即与 fsimage 进行合并,也不会刷到NameNode 的内存中,而是会先写到 edits 中(因为合并需要消耗大量的资源),操作成功之后更新至内存。
  • dfs.namenode.checkpoint.period dfs.namenode.checkpoint.txns 两个配置,只要达到这两个条件任何一个,secondarynamenode 就会执行 checkpoint 的操作。
  • 当触发 checkpoint 操作时,NameNode 会生成一个新的 edits 即上图中的 edits.new 文件,同时 SecondaryNameNode 会将 edits 文件和 fsimage 复制到本地(HTTP GET 方式)。
  • secondarynamenode 将下载下来的 fsimage 载入到内存,然后一条一条地执行 edits 文件中的各项更新操作,使得内存中的 fsimage 保存最新,这个过程就是edits fsimage文件合并,生成一个新的 fsimage 文件即上图中的 Fsimage.ckpt 文件。
  • secondarynamenode 将新生成的 Fsimage.ckpt 文件复制到 NameNode 节点。
  • NameNode 节点的 edits.new 文件和 Fsimage.ckpt 文件会替换掉原来的 edits 文件和 fsimage 文件,至此刚好是一个轮回,即在 NameNode 中又是 edits fsimage 文件。
  • 等待下一次 checkpoint 触发 SecondaryNameNode 进行工作,一直这样循环操作。
  •  Checkpoint 触发条件

      Checkpoint 操作受两个参数控制,可以通过 core-site.xml 进行配置:

  • <property>
      <name>dfs.namenode.checkpoint.period</name>
      <value>3600</value>
      <description>
        两次连续的 checkpoint 之间的时间间隔。默认 1 小时
      </description>
    </property>
    <property>
      <name>dfs.namenode.checkpoint.txns</name>
      <value>1000000</value>
      <description>
        最大的没有执行 checkpoint 事务的数量,满足将强制执行紧急 checkpoint,即使
        尚未达到检查点周期。默认设置为 100 万。
      </description>
    </property>

           从上面的描述我们可以看出,SecondaryNamenode 根本就不是 Namenode 的一个热备,其只是将 fsimage edits 合并。其拥有的 fsimage 不是最新的,因为在他从 NameNode 下载 fsimageedits 文件时候,新的更新操作已经写到 edit.new 文件中去了。而这些更新在 SecondaryNamenode 是没有同步到的!当然, 如果 NameNode 中的 fsimage 真的出问题了,还是可以用SecondaryNamenode 中的 fsimage 替换一下NameNode 上的 fsimage ,虽然已经不是最新的 fsimage ,但是我们可以将损失减小到最少

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值