HDFS - NameNode的高可用提到了NameNode有active状态和standby状态,他还有另一个状态,就是safemode,安全模式。在安全模式下,HDFS不接收对元素修改的请求,只容许对元数据的读请求。如下是几种进入安全模式的方式:java
当NameNode启动的时候,会获取文件所在的磁盘分区里真正可使用的存储空间,而后跟duReserved进行对比,若是存储空间大于duReserved,则返回true,若是小于,则返回false,返回值赋值给返回值给hasResourcesAvailable。duReserved默认为100M,能够经过dfs.namenode.resource.du.reserved
进行配置。
hasResourcesAvailable为false的时候,说明可用存储空间不足100M,此时进入安全模式。node
NameNode启动的时候,会从磁盘fsimage加载元数据,加载后他就知道了总共有多少个block,可是他不知道这些block在DataNode中是否正常,因此进入安全模式,等待DataNode上报本身的block信息,当上报的block个数达到必定阈值的时候,就会退出安全模式,下面是具体的计算过程。
在HDFS中,block的状态包括正在构建的和complete两种状态,因此咱们要获取到complete的block个数,就须要先获取全部的block,而后减去正在构建的block,这样就能够获取到complete的block个数。
threshold参数,好比为0.9,说明block数量为100的状况下,只要存在90个正常的block就能够了,由于HDFS集群的文件数量是至关多的,他的默认值是0.999,表明1000个block至少要999个是正常的,能够经过dfs.namenode.safemode.threshold-pct
进行配置。
complete的block个数乘以threshold,这个值就是要保证HDFS正常写请求的最低数据量,若是datanode汇报过来的block个数blockSafe比最低数据量还小,那就要进入安全模式。segmentfault
datanode的存活个数datanodeThreshold默认为0,表明的不启用,若是有设置,那就要与DataNode的个数进行判断,若是存活的DataNode个数小于设置的值,那须要进入安全模式。安全
除了上面三种自动进入安全模式外,咱们还能够经过命令让HDFS进入安全模式:spa
命令 | 描述 |
---|---|
hdfs dfsadmin -safemode get | 查看安全模式的状态 |
hdfs dfsadmin -safemode enter | 进入安全模式 |
hdfs dfsadmin -safemode wait | 进入安全模式 |
hdfs dfsadmin -safemode leave | 离开安全模式 |
enter
和wait
都是进入安全模式,区别是enter是必定进入安全模式的,wait是等待HDFS进入安全模式,就好像在java中执行gc命令,并不会直接执行gc命令同样。code