工作流程(理解)
- 启动NameNode,NameNode加载fsimage到内存,对内存数据执行edits log日志中的事务操作。
- 文件系统元数据内存镜像加载完毕,进行fsimage和edits log日志的合并,并创建新的fsimage文件和一个空的edits log日志文件。
- NameNode等待DataNode上传block列表信息,直到副本数满足最小副本条件。
- 当满足了最小副本条件,再过30秒,NameNode就会退出安全模式。最小副本条件指整个文件系统中有99.9%的block达到了最小副本数(默认值是1,可设置)
在NameNode安全模式(safemode)
- 对文件系统元数据进行只读操作
- 当文件的所有block信息具备的情况下,对文件进行只读操作
- 不允许进行文件修改(写,删除或重命名文件)
注意事项
- NameNode不会持久化block位置信息;DataNode保有各自存储的block列表信息。正常操作时,NameNode在内存中有一个block位置的映射信息。
- NameNode在安全模式,NameNode需要给DataNode时间来上传block列表信息到NameNode。如果NameNode不等待DataNode上传这些信息的话,则会在DataNode之间进行block的复制,而这在大多数情况下都是非必须的(因为只需要等待DataNode上传就行了),还会造成资源浪费。
- 在安全模式NameNode不会要求DataNode复制或删除block。
- 新格式化的HDFS不进入安全模式,因为DataNode压根就没有block。
配置信息
以dfs开头的属性均在hdfs-site.xml文件中配置
属性名称 | 类型 | 默认值 | 描述 |
dfs.namenode.replication.min hdfs-site.xml | Int | 1 | 写文件成功的最小副本数 |
dfs.namenode.safemode.threshold-pct | float | 0.999 | 系统中block达到了最小副本数的比例,之后NameNode会退出安全模式。小于等于0表示不进入安全模式,大于1表示永不退出安全模式 |
dfs.namenode.safemode.extension | int ms | 30000 | 当副本数达到最小副本条件之后安全模式延续的时间。对于小的集群(几十个节点),可以设置为0 |
命令操作(了解)
通过命令查看namenode是否处于安全模式:
$ hdfs dfsadmin -safemode get
Safe mode is ON
HDFS的前端webUI页面也可以查看NameNode是否处于安全模式。
有时候我们希望等待安全模式退出,之后进行文件的读写操作,尤其是在脚本中,此时:
$ hdfs dfsadmin -safemode wait
# your read or write command goes here
管理员有权在任何时间让namenode进入或退出安全模式。进入安全模式:
$ hdfs dfsadmin -safemode enter
Safe mode is ON
这样做可以让namenode一直处于安全模式,也可以设置dfs.namenode.safemode.threshold-pct为1做到这一点。
离开安全模式:
$ hdfs dfsadmin -safemode leave
Safe mode is OFF