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
- 可以通过下面的属性设置这个时间间隔:
- 可以设置