一、集群启动
首先要记住,集群启动的时候必定是处于安全模式中的。
NameNode启动
NameNode启动时,首先将镜像文件(Fsimage)载入内存,并执行编辑日志(Edits)中的各项操作。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的Fsimage文件和一个空的编辑日志。此时,NameNode开始监听DataNode请求。这个过程期间,NameNode一直运行在安全模式,即NameNode的文件系统对于客户端来说是只读的。
DataNode启动
系统中的数据块的位置并不是由NameNode维护的,而是以块列表的形式存储在DataNode中。在系统的正常操作期间,NameNode会在内存中保留所有块位置的映射信息。
在安全模式下,各个DataNode会向NameNode发送最新的块列表信息,NameNode了解到足够多的块位置信息之后,即可高效运行文件系统。
退出安全模式
只要满足“最小副本条件”,NameNode就会在30秒后退出安全模式。
所谓的最小副本条件指的是在整个文件系统中99.9%的块满足最小副本级别(默认值:dfs.replication.min=1)
在启动一个刚刚格式话过的集群的时候,因为系统中还没有任何块,所以NameNode不会进如安全模式。
集群处于安全模式,不能执行重要操作(写操作)。集群启动完成后,自动退出安全模式。
二、异常情况block损坏
当block异常损坏的时候,即block丢失。当NameNode发现集群中的block丢失到一定数量的阈值的时候,NameNode就会进去安全模式,不在接受客户端的数据更新要求。
解决方法
1、降低阈值
hdfs-site.xml中:
dfs.namenode.safemode.threshold-pct
0.999f
2、强制离开安全模式
hdfs dfsadmin-safemode leave
3、重新格式化集群
4、修复异常损坏的block块
三、总结
1、安全模式中会导致NameNode的文件系统对于客户端来说是只读的。
2、集群进入安全模式的俩种情况:
(1)集群启动时
(2)block异常损坏时
3、解决办法
(1)降低阈值
(2)强制离开
(3)重新格式化集群
(4)修复损坏的block块