HDFS的NameNode和SecondaryNode机制

Hdfs 之 NameNode 和 SecondaryNameNode

NN 和 2NN 工作机制

思考:NameNode 的元数据是存储在哪里的?

首先,我们做个假设,如果是存储在 NameNode 节点的磁盘里,因为经常需要进行随机访问,还要响应客户端的请求,必然效率过低。因此,元数据需要存放在内存中。但如果只存在内存中,一旦断电,元数据必然丢失,整个集群就无法工作了。因此产生在磁盘中备份 Fsimage。

这样就会带来全新的问题,当在内存中的元数据更新时,如果同时更新 Fsimage,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦 NameNode 节点断电,就会产生数据丢失。因此,引入 Edits 文件(只进行追加操作,效率很高)。每当有元数据更新或者添加元数据时,修改内存中的元数据并追加到 Edits 中。这样,一旦 NameNode 节点断电,还可以通过 Fsimage 和 Edits 合并,合成元数据。

但是,如果长时间添加数据到 Edits 中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间比较长。因此需要定期进行 FsImage 和 Edits 文件的合并,如果这两个操作由 NameNode 节点完成,又会效率过低。因此,引入一个新的节点 SecondaryNameNode,专门用于 Fsimage 和 Edits 的合并。

NameNode 工作机制

工作机制
工作机制

第一阶段:NameNode 启动

  • 第一次启动 NameNode 格式化后,创建 Fsimage 和 Edits 文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
  • 客户端对元数据进行增删改的请求。
  • NameNode 记录操作日志,更新滚动日志。
  • NameNode 在内存中对元数据进行增删改。

第二阶段:Secondary NameNode 工作

  • Secondary NameNode 询问 NameNode 是否需要 CheckPoint.直接带回 NameNode 是否检查结果。

  • Secondary NameNode 请求执行 CheckPoint

  • NameNode 滚动正在写的 Edits 日志。

  • 将滚动前的编辑日志和镜像文件拷贝到 Secondary NameNode

  • Secondary NameNode 加载编辑日志和镜像文件拷贝到 Secondary NameNode

  • 生成新的镜像文件 fsimage.chkpoint

  • 拷贝 fsimage.chkpoint 到 NameNode

  • NameNde 将 fsimage.chkpoinit 重新命名为 fsimage

Fsimage 和 Edits 解析

NameNode 格式化后,将在数据 hadoop 的数据存储目录/tmp/dfs/name/current 目录中产生如下文件

  • fsimage_00000000000000
  • fsimage_00000000000000.md5
  • seen.txid
  • VERSION
  1. Fsimage 文件:HDFS 文件系统元数据的一个永久性的检查点,期中包含 HDFS 文件系统的所有目录和文件 inode 的序列化信息。
  2. Edits 文件:存放 HDFS 文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到 Edits 文件中。
  3. Seen.txid 文件保存的是一个数字,就是最后一个 edits_的数字
  4. 每次 NameNode 启动的时候都会将 Fsimage 文件读入内存,加载 Edits 里面的更新操作,保证内存中的元数据是最新的,同步的,都可以堪称 NameNode 启动的时候就将 Fsimge 和 Edits 文件进行了合并。
  • oiv 查看 Fsimage 文件

    • 查看 oiv 和 oev 命令

      [atguigu@hadoop102 current]$ hdfs

      oiv apply the offline fsimage viewer to an fsimage

      oev apply the offline edits viewer to an edits file

    • 基本语法

      hdfs oiv -p 文件类型 -i 镜像文件 -o 转换后文件输出路径

    • 案例实操

      pwd

      /opt/module/hadoop-3.1.3/data/dfs/name/current

      hdfs oiv -p XML -i fsimage_0000000000000000025 -o /opt/module/hadoop-3.1.3/fsimage.xml

      注意:初始镜像文件是不能直接查看的 会乱码

      cat /opt/module/hadoop-3.1.3/fsimage.xml

    • 结论

      在 Fsimage 中并没有记录块所对应的 DataNode,为什么?

      在集群启动后,要求 DataNode 上报数据块信息,并间隔一段时间再次上报

  • oev 查看 Edits 文件

    • 基本语法

      hdfs oev -p 文件类型 -i 编辑日志 -o 转换后文件输出路径

    • 案例实操

      hdfs oev -p XML -i edits_0000000000000000012-0000000000000000013 -o /opt/module/hadoop-3.1.3/edits.xml

    • 结论

      NameNode 如何确定下次开机启动的时候合并哪些 Edits?

      NameNode 每次会合并编号最靠后的 Edits

CheckPoint 时间设置

此类文件在默认配置文件中

  1. 通常情况下,SecondaryNameNode 每隔一小时执行一次。

    hdfs-default.xml

    dfs.namenode.checkpoint.period

    3600s

  2. 一分钟检查一次操作次数,当操作次数达到 1 百万时,SecondaryNameNode 执行一次。

    dfs.namenode.checkpoint.txns

    1000000

    操作动作次数

    dfs.namenode.checkpoint.check.period

    60s

    1 分钟检查一次操作次数

  3. checkpointSecondNameNode询问Namenode是否需要进行合并 Fsimage 和 Edits 文件的时间点。

- END -
posted @ 2021-10-19 16:44  逆十字  阅读(225)  评论(0)    收藏  举报