问题说明
Hadoop集群启动之后,HDFS进入了安全模式,并且不会自动退出,提示信息如下
Safe mode is ON.
The reported blocks 1223 needs additional 3 blocks to reach the threshold 0.9990 of total blocks 1228.
The minimum number of live datanodes is not required.
Safe mode will be turned off automatically once the thresholds have been reached.
该提示信息表示可用数据块的比例并没有达到要求的阈值,因此开启安全模式
问题解决
根据提示信息,去查找不可用的数据块,执行hdfs fsck /
指令
该指令可用用于检查 Hadoop 文件系统的健康状况和完整性,会扫描整个 HDFS 文件系统,检查文件及其数据块的状态,报告是否有丢失的块、损坏的块或未被正确复制的块
执行指令之后出现了若干条错误信息,如下
说明有多个块未被正确复制,或是由于数据节点的问题导致副本不可用
这里我们注意到,出现问题的块都在/tmp/hadoop-yarn/staging/
路径下
该路径一般用于存储作业在提交和运行期间所需的临时文件和资源,因为该目录是临时的,一般来说在执行完作业后,YARN会自动清理这些资源,因此初步判断是因为某些YARN作业出现异常,导致这些临时资源占用了额外的存储空间,并且出现了副本异常的问题;
所以解决方法如下:
- 直接删除这些文件,不会对HDFS造成任何影响(注意:需要先手动退出安全模式
hdfs dfsadmin -safemode leave
,然后再删除文件,最后重启集群即可) - 可以考虑修改
hdfs-site.xml
中的配置:
<property>
<name>dfs.safemode.threshold.pct</name>
<value>0.95</value>
</property>
降低阈值:将dfs.safemode.threshold.pct
的值调小(默认是0.999)
该参数指定了在集群中,必须有多少比例的文件块(即数据块)是可用的,才能使 HDFS 退出安全模式
- 手动退出安全模式:
hdfs dfsadmin -safemode leave
(缺点:集群重启后仍然不会自动退出安全模式)
建议:尽量不要选择降低阈值和手动退出安全模式的操作,因为在安全模式下,不允许数据的删除和写入操作,这样是为了保证数据完整性,如果降低阈值或手动退出安全模式,可能会在块不完整的情况下进行其他操作,导致数据不一致问题;
因此建议手动对有问题的数据块进行处理,该备份的就进行副本的备份(hdfs dfs -setrep -w <replication_num> <block_path>
),该删除的直接删除即可