HDFS - NameNode的高可用提到了NameNode有active状态和standby状态,他还有另外一个状态,就是safemode,平安模式。在平安模式下,HDFS不接管对元素批改的申请,只容许对元数据的读申请。以下是几种进入平安模式的形式:
可用空间
当NameNode启动的时候,会获取文件所在的磁盘分区里真正能够应用的存储空间,而后跟duReserved进行比照,如果存储空间大于duReserved,则返回true,如果小于,则返回false,返回值赋值给返回值给hasResourcesAvailable。duReserved默认为100M,能够通过dfs.namenode.resource.du.reserved
进行配置。
hasResourcesAvailable为false的时候,阐明可用存储空间有余100M,此时进入平安模式。
block个数
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比最低数据量还小,那就要进入平安模式。
datanode的存活个数
datanode的存活个数datanodeThreshold默认为0,代表的不启用,如果有设置,那就要与DataNode的个数进行判断,如果存活的DataNode个数小于设置的值,那须要进入平安模式。
命令
除了下面三种主动进入平安模式外,咱们还能够通过命令让HDFS进入平安模式:
命令 | 形容 |
---|---|
hdfs dfsadmin -safemode get | 查看平安模式的状态 |
hdfs dfsadmin -safemode enter | 进入平安模式 |
hdfs dfsadmin -safemode wait | 进入平安模式 |
hdfs dfsadmin -safemode leave | 来到平安模式 |
enter
和wait
都是进入平安模式,区别是enter是肯定进入平安模式的,wait是期待HDFS进入平安模式,就如同在java中执行gc命令,并不会间接执行gc命令一样。