10.1 NameNode和SecondaryNameNode工作机制
HDFS启动后会自动在后台开启 3 个守护进程:NameNode, SecondaryNameNode和DataNode.
这一节我们先学习NameNode和SecondaryNameNode的工作机制,下节再学习DataNode的工作机制.
10.1.1 NameNode工作机制
NameNode是用来保存HDFS的元数据数据信息, 比如: 命名空间信息, 块信息等.
这些元数据信息是保存在内存中的.
但是内存中的数据断电之后会消失, 然后当我们重启HDFS之后, 发现我们存储的那些数据仍然是存在的, 仍然是可以访问到的.
这是为什么呢?
因为, 这些元数据信息不仅保存在内存中, HDFS也会对这些元数据信息做持久化的存储, 从而保存在我们的磁盘介质中.
HDFS在磁盘中会生成两个文件来保存元数据信息和编辑日志信息.
- 命名空间镜像(文件系统镜像,
File System Image,FSImage) - 编辑日志(
editlog)
NameNode工作机制分解:
当启动
NameNode的时候, 加载FSImage和edits文件中的内容, 并合并他们, 生成所有数据的元数据, 然后保存在NamoNode所在节点的内存中.如果是
NameNode第一次启动, 则会创建FSImage和edits这两个文件.当对数据进行增删改(不包括读)的时候,
NameNode会把所有的操作步骤记录到edits文件中.然后再去更新内存中的元数据信息.
注意:
- 加载
FSImage和edits并合并他们只发生在NameNode启动阶段. 其他任何的阶段都不会执行这个操作.
10.1.2 SecondaryNameNode工作机制
首先知道一点: SecondaryNameNode不是NameNode的热备份, 他做的事情与NameNode是完全不同的.
很多人总是误解SecondaryNameNode, 主要是因为这个名字起得不好.
虽然SecondaryNameNode与NameNode做的事情不一样, 但是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的步骤如下:
SecondaryNameNode请求NameNode停止正在使用的edits文件, 创建一个新的edits文件, 这样新的操作纪律就会记录到新的edits文件中.(edits滚动)SecondaryNameNode通过http get从NameNode读取到最近的FSImage和edits(不是新创建的那个).SecondaryNameNode把读取过来的FSImage和edits加载到内存, 把edits合并到FSImage中.合并成功之后,
SecondaryNameNode将新的FSImage发送到NameNode,NameNode将其保存为临时的.ckpt文件.NameNode重新命名临时的FSImage文件, 便于日后使用.最终,
NameNode拥有了比较新FSImage和一个正在进行中比较小的edits文件.
由于SecondaryNameNode需要把FSImage加载到内存, 所以对内存的要求也是比较多的, 与NameNode的需要类似.所以需要将其放在专门的服务器上, 不能与NameNode在同一台设备.否则内存不够用.
触发checkpoint的时机
上面就是SecondaryNameNode工作机制, 但是有一点没有说明: 那就是什么时候才会触发checkpoint?
下面两个条件, 满足任意把一个都会触发checkpoint:
默认情况下每隔一小时创建一次
checkpoint.- 可以通过
dfs.namenode.checkpoint.period属性来设置, 单位是s
- 可以通过
edits存储满, 即使还没有达到 1 小时: 默认是达到1000000条事务.- 可以设置
edits的上限条件:dfs.namenode.checkpoint.txns - 默认情况下, 每隔
1分钟检测一次edits是否存储满.- 可以通过下面的属性设置这个时间间隔:
dfs.namenode.checkpoint.check.period
- 可以通过下面的属性设置这个时间间隔:
- 可以设置
