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 | hdfs dfsadmin -safemode get # 查看是否处于安全模式 |