目前来看,导致hdfs一直处于safemode模式最直接的原因是已成功复制的块的比例没有达到默认值,块的损坏也会造成一直处于安全模式。
1)文件系统中有损坏的文件,使用fsck命令来查看
hadoop fsck /
以上是查看hdfs的根目录下的所有文件健康状况,如果有损坏的文件,就会提示:
The filesystem under path '/' is CORRUPT(损坏)
接下来就是排错,查看究竟是哪个目录下有损坏文件,使用fsck遍历检查根目录下的每个子目录,查看时候有损坏文件,例如查看user目录:
hadoop fsck /user
找到损坏的文件,删除掉即可,最终在使用fsck检查hdfs文件系统已完好:
但是看到Missing replicas一栏中,有321个副本丢失了,比如某个文件的复制因子是3,结果只有2个,那么表示有1个副本丢失了,所有的文件丢失副本数之后就是Missing replicas。同样使用fsck遍历所有目录,查看究竟是那些文件的冗余数量不够。
首先查看/user/Englishinput,命令如下:
hadoop fsck /user/EnglishInput -files -blocks -locations
仅仅这一个目录就有265个备份丢失,删除此目录。
Under开头的记录就是异常块的情况,数字.开头的就是正常的块情况。
2)以下就是hdfs正常情况的形式:
红色的箭头表示对一个文件的检查情况:1 block(s)表示这个文件只由一个块组成,ok表示文件处于正常状态。
蓝色箭头指示了“Average block replication”块平均复制因子2.8,因为其中有一个文件传到集群上是系统配置的复制因子是1,因此其复制因子是1,才导致平均复制因子是1.
3)修改配置文件中的复制因子值,并不会改变修改之前集群中文件的复制因子,必须重启hadoop才能使其生效。也可以使用命令行的方式修改,不用重新启动即可生效,不过依然不会修改之前文件的复制因子。
4)使用第二种方法的结果如下所示;