10.1 NameNode和SecondaryNameNode工作机制

HDFS启动后会自动在后台开启 3 个守护进程:NameNode, SecondaryNameNodeDataNode.

这一节我们先学习NameNodeSecondaryNameNode的工作机制,下节再学习DataNode的工作机制.


10.1.1 NameNode工作机制

NameNode是用来保存HDFS的元数据数据信息, 比如: 命名空间信息, 块信息等.

这些元数据信息是保存在内存中的.

但是内存中的数据断电之后会消失, 然后当我们重启HDFS之后, 发现我们存储的那些数据仍然是存在的, 仍然是可以访问到的.

这是为什么呢?

因为, 这些元数据信息不仅保存在内存中, HDFS也会对这些元数据信息做持久化的存储, 从而保存在我们的磁盘介质中.

HDFS在磁盘中会生成两个文件来保存元数据信息和编辑日志信息.

  • 命名空间镜像(文件系统镜像, File System Image, FSImage)
  • 编辑日志(editlog)

NameNode工作机制分解:

  1. 当启动NameNode的时候, 加载FSImageedits文件中的内容, 并合并他们, 生成所有数据的元数据, 然后保存在NamoNode所在节点的内存中.

  2. 如果是NameNode第一次启动, 则会创建FSImageedits这两个文件.

  3. 当对数据进行增删改(不包括读)的时候, NameNode会把所有的操作步骤记录到edits文件中.

  4. 然后再去更新内存中的元数据信息.

注意:

  • 加载FSImageedits并合并他们只发生在NameNode启动阶段. 其他任何的阶段都不会执行这个操作.

10.1.2 SecondaryNameNode工作机制

首先知道一点: SecondaryNameNode不是NameNode的热备份, 他做的事情与NameNode是完全不同的.

很多人总是误解SecondaryNameNode, 主要是因为这个名字起得不好.

虽然SecondaryNameNodeNameNode做的事情不一样, 但是SecondaryNameNode做的事情却与NameNode息息相关.

其实SecondaryNameNode就是NameNode的小蜜, NameNode不方便, 不合适做的事情SecondaryNameNode来做.

如果当初SecondaryNameNode的名字起为AssistNameNode(辅助NameNode)可以会更加容易让人接受一点.


在启动NameNode的时候, NameNode会把edits中的操作步骤合并到FSImage中.

edits中是记录的我们的对元数据修改的操作步骤, 由于NameNode很少会重新启动, 随着时间的增长, edits的文件会变的越来越大, 那么一旦NameNode需要重启, 则合并的时间会过长,导致NameNode启动缓慢, 进而影响到整个集群的正常工作.

那么SecondaryNameNode要做的事情就是定期把edits合并到FSImage中, 来防止edits过大, 从而不会导致NameNode启动的过于缓慢.

有人说, 那这个工作为啥不让NameNode自己做呢? 因为NameNode要把主要精力放在处理文件的读写请求上, 为了更快的响应客户端的读写请求.


SecondaryNameNode工作机制分解

SecondaryNameNode工作的主要内容就是为NameNode创建checkpoint(检查点), 从而完成自己的辅助工作.

创建checkpoint的步骤如下:

  1. SecondaryNameNode请求NameNode停止正在使用的edits文件, 创建一个新的edits文件, 这样新的操作纪律就会记录到新的edits文件中.(edits滚动)

  2. SecondaryNameNode通过http getNameNode读取到最近的FSImageedits(不是新创建的那个).

  3. SecondaryNameNode把读取过来的FSImageedits加载到内存, 把edits合并到FSImage中.

  4. 合并成功之后, SecondaryNameNode将新的FSImage发送到NameNode, NameNode将其保存为临时的.ckpt文件.

  5. NameNode重新命名临时的FSImage文件, 便于日后使用.

  6. 最终, NameNode拥有了比较新FSImage和一个正在进行中比较小的edits文件.

由于SecondaryNameNode需要把FSImage加载到内存, 所以对内存的要求也是比较多的, 与NameNode的需要类似.所以需要将其放在专门的服务器上, 不能与NameNode在同一台设备.否则内存不够用.


触发checkpoint的时机

上面就是SecondaryNameNode工作机制, 但是有一点没有说明: 那就是什么时候才会触发checkpoint?

下面两个条件, 满足任意把一个都会触发checkpoint:

  1. 默认情况下每隔一小时创建一次checkpoint.

    • 可以通过dfs.namenode.checkpoint.period属性来设置, 单位是s
  2. edits存储满, 即使还没有达到 1 小时: 默认是达到1000000条事务.

    • 可以设置edits的上限条件: dfs.namenode.checkpoint.txns
    • 默认情况下, 每隔1分钟检测一次edits是否存储满.
      • 可以通过下面的属性设置这个时间间隔:dfs.namenode.checkpoint.check.period

Copyright © 尚硅谷大数据 2013-2019 all right reserved,powered by Gitbook
该文件最后修订时间: 2018-11-20 18:14:11

results matching ""

    No results matching ""