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命令一样。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。