前言

本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和参考文献请见1000个问题搞定大数据技术体系

正文

HDFS 的安全模式是什么?

NameNode 启动时,首先将映像文件载入内存,并执行编辑日志中的各项编辑操作。

一旦在内存中成功建立文件系统元数据的映像,则创建一个新的 FSImage 文件(该操作不需要借助辅助 NameNode )和一个空的编辑日志(EditLog)。

在这个过程中, NameNode 运行在安全模式,意味着 NameNode 的文件系统对于客户端来说是只读的。

系统中数据块的位置并不是由 NameNode 维护的,而是以块列表的形式存储在 datanode中(每个 datanode存储的块组成的列表)。

在系统的正常操作期间, NameNode 会在内存中保留所有块位置的映射信息。

在安全模式下, 各个 datanode会向 NameNode 发送最新的块列表信息, NameNode 了解到足够多的块位置信息之后,即可高效运行文件系统。

如果 NameNode 认为向其发送更新信息的 datanode节点过少,则它会启动块复制进程,以将数据块复制到新的 datanode节点。

然而,在大多数情况下上述操作都是不必要的(因为实际上 NameNode 只需继续等待更多 datanode发送更新信息即可),并浪费了集群的资源。

实际上,在安全模式下 NameNode 并不向 datanode发出任何块复制或块删除的指令。

如果满足“最小副本条件”(minimal replication condition), NameNode 会在30秒钟之后就退出安全模式。

所谓的最小副本条件指的是在整个文件系统中有99.9%的块满足最小副本级别(默认值是1,由dfs.namenode.replication.min属性设置)。

在启动一个刚刚格式化的HDFS集群时,因为系统中还没有任何块,所以 NameNode 不会进入安全模式。

关于安全模式的 Shell 命令

要想査看 NameNode 是否处于安全模式,可以像下面的命令:

[hadoop@node1 ~]$ hdfs dfsadmin -safemode get
Safe mode is OFF

HDFS的网页界面也能够显示 NameNode 是否处于安全模式。

有时,用户期望在执行某条命令之前 NameNode 先退出安全模式,特别是在脚本中。使用wait选项能够达到这个目的:

wait 前必须处于安全模式下,不然会显示 Safe mode is OFF

在这里插入图片描述

管理员随时可以让 NameNode 进入或离开安全模式。

这项功能在维护和升级集群时非常关键,因为需要确保数据在指定时段内是只读的。

使用以下指令进入安全模式:

[hadoop@node1 ~]$ hdfs dfsadmin -safemode enter
Safe mode is ON

前面提到过, NameNode 在启动阶段会处于安全模式。在此期间也可使用这条命令,从而确保 NameNode 在启动完毕之后不离开安全模式。

另种使 NameNode 水远处于安全模式的方法是将属性 dfs.namenode.safemode.threshold-pet 的值设为大于1。

运行以下指令即可使得 NameNode 离开安全模式:

[hadoop@node1 ~]$ hdfs dfsadmin -safemode leave
Safe mode is OFF
上一篇 下一篇