缘由:
由于失误,误将hadoop.tmp.dir指定文件夹下的filecache文件删除了,由此导致存储在hdfs集群的元数据丢失,造成hadoop集群启动之后一直处于安全模式开启状态。
//查询Hadoop集群安全模式状态
[hadoop@hadoop01 ~]$hdfs dfsadmin -safemode get
//开启Hadoop集群安全模式状态
[hadoop@hadoop01 ~]$hdfs dfsadmin -safemode enter
//关闭Hadoop集群安全模式状态
[hadoop@hadoop01 ~]$hdfs dfsadmin -safemode leave
查看原因及解决办法如下:
1 我如何知道hadoop hdfs文件系统是否有损坏的块,如何修复它?
确定这一点的最简单方法是在文件系统上运行fsck。如果已经设置了hadoop环境变量,那么应该能够使用/路径(如果不是hdfs://ip.or.hostname:50070/)。
// 执行以下命令查看是否有块缺失
[hadoop@hadoop01 ~]$ hdfs fsck /
// 或者:
[hadoop@hadoop01 ~]$hdfs fsck hdfs://ip.or.hostname:50070/
如果执行上面命令完毕之后,结果如下:
.............................Status: CORRUPT
Total size: 3453345169348 B (Total open files size: 664 B)
Total dirs: 15233
Total files: 14029
Total symlinks: 0 (Files currently being written: 8)
Total blocks (validated): 40961 (avg. block size 84308126 B) (Total open file blocks (not validated): 8)
********************************
CORRUPT FILES: 2
MISSING BLOCKS: 2 // 丢失块数
MISSING SIZE: 15731297 B // 此处显示丢失块总大小
CORRUPT BLOCKS: 2
********************************
Corrupt blocks: 2
Number of data-nodes: 12
Number of racks: 2
FSCK ended at Fri Mar 27 XX:03:21 UTC 201X in XXX milliseconds
The filesystem under path '/' is CORRUPT
2 我如何知道哪些文件的块是损坏的?
运行以下命令可以查出哪些块丢失:(显示信息比较多)
// 运行下列命令
[hadoop@hadoop01 ~]hdfs fsck / | egrep -v '^\.+$' | grep -v replica | grep -v Replica
//或者
[hadoop@hadoop01 ~]hdfs fsck hdfs://ip.or.host:50070/ | egrep -v '^\.+$' | grep -v replica | grep -v Replica
这将列出受影响的文件,输出信息可能很多,将显示当前可能存在未充分复制块的文件(不一定是有问题的块)。输出应该包括所有受影响文件的类似内容。
//输出信息如下
/path/to/filename.fileextension: CORRUPT blockpool BP-1016133662-10.29.100.41-1415825958975 block blk_1073904305
/path/to/filename.fileextension: MISSING 1 blocks of total size 15620361 B
................
// 此处“/path/to/filename.fileextension”即为,你丢失块的文件路径
下一步是确定文件的重要性,是否可以直接删除并复制到适当的位置,或者是否需要重新生成敏感数据?
如果替换文件非常简单,那么我将采用这种方法。从hadoop集群中删除损坏的文件,此命令将损坏的文件移动到回收站中。
// 执行下面命令,根据上面查询到的块路径来删除缺失文件 注意删除文件或是文件夹 要在 -rm后添加 -r或者-f
[hadoop@hadoop01 ~]hdfs dfs -rm /path/to/filename.fileextension
//或者
[hadoop@hadoop01 ~]hdfs dfs -rm hdfs://ip.or.hostname.of.namenode:50070/path/to/filename.fileextension
或者您可以跳过回收站,直接永久删除(这可能是您想要做的)
// 执行
[hadoop@hadoop01 ~]hdfs dfs -rm -skipTrash /path/to/filename.fileextension
// 或者
[hadoop@hadoop01 ~]hdfs dfs -rm -skipTrash hdfs://ip.or.hostname:50070/path/to/filename.fileextension
3 如果损坏的文件不容易替换,我该如何修复?
以下命令或许会有帮助,但是第一步是收集关于文件位置和块的信息。
//执行
[hadoop@hadoop01 ~]hdfs fsck /path/to/filename/fileextension -locations -blocks -files
//或者
[hadoop@hadoop01 ~]hdfs fsck hdfs://ip.or.hostname.of.namenode:50070/path/to/filename/fileextension -locations -blocks -files
通过这些数据,您可以跟踪损坏所在的节点。在这些节点上,您可以查看日志并确定问题所在。如果磁盘被替换,服务器上的i/o错误,等等。如果可能的话,可以在该机器上恢复,并在线获得分区和块,这些块将报告给hadoop,文件将再次恢复完整。如果此方法不可行,那就只能另寻他法了。