HDFS NameNode启动过程及安全模式

1. NameNode启动过程

NameNode启动过程:

  • 读取fsimage和edits到内存中
  • 执行edits的各项操作,更新内存中的元数据,存在内存中的元数据支持客户端的读操作
  • 将内存中的元数据写到新的fsimage文件中
  • 创建一个新的空的edits文件。同时启动HDFS的安全模式,监听DataNode的请求
  • 启动DataNode
    • 向NameNode注册
    • 发送BlockReport。发送完之后,关闭HDFS的安全模式
  • 之后HDFS的所有操作都记录到新的edits中

注意:系统中的数据块的位置并不是甶NameNode维护的,而是以块列表的形式存储在DataNode中。在系统的正常操作期间,NameNode会在内存中保留所有块位置的映射信息。在安全模式下,各个DataNode会向 NameNode发送最新的块列表信息,NameNode了解到足够多的块位置信息之后,即可高效运行文件系统。

HDFS的安全模式(SafeMode):

  • 等待DataNode向NameNode发送BlockReport。在安全模式期间,客户端只能读取HDFS,但是不能写HDFS(创建文件夹、上传文件、删除文件 都不能操作)。
  • 汇总所有的BlockReport。一开始NameNode加载完fsimage和edits时,就得知整个文件系统总共有多少个block(total blocks)。从不断接收到的BlockReport中,不断累计得到所有的DataNode上总共有多少block(reported blocks)。计算 reported blocks / total blocks,如果比值 >= 99.9%,安全模式才会退出。而这里99.9%的块的要求是副本数满足最小副本数 dfs.replication.min(默认值为1)。
  • 安全模式退出后,客户端就能对HDFS执行写操作了。

特殊情况:刚刚格式化完HDFS,因为还没有任何块,所以NameNode不会进入安全模式。

2. 验证安全模式的存在

关闭HDFS所有服务,只启动namenode

1
hadoop-daemon.sh start namenode

查看namenode的web ui,可以看到NameNode处于SafeMode。

  • total blocks有3个,接收到的reported blocks只有0个
  • 只有当 reported blocks / total blocks >= 0.9990,才会关闭SafeMode

启动datanode

1
hadoop-daemon.sh start datanode

启动后,在短时间内再次查看namenode的web ui,可以看到NameNode仍处于SafeMode。total blocks有3个,接收到的reported blocks也有3个,所以 reported blocks / total blocks = 1 >= 0.9990,已经触发了关闭SafeMode的条件。因此在30秒之后,NameNode将自动关闭SafeMode

经过30秒后,再次查看namenode的web ui

3. 为什么达到关闭SafeMode的条件,还要缓冲30秒?

服务器求稳不求快,给30秒让HDFS稳定一下

4. 手动操作SafeMode

1
2
3
4
hdfs dfsadmin -safemode get   # 查看是否处于安全模式
hdfs dfsadmin -safemode enter # 手动进入安全模式
hdfs dfsadmin -safemode leave # 强制退出安全模式
hdfs dfsadmin -safemode wait # 挂起shell,直到安全模式退出
panchaoxin wechat
关注我的公众号
支持一下