一、原因
由断电或其它原因引起的HDFS服务不正常或者块损坏
二、解决
(一)、检查HDFS的文件的健康状态
hdfs fsck /
(二)、查看损坏的块以及文件的对应关系
hdfs fsck -list-corruptfileblocks
(三)、解决办法:
数据可以从其它地方找到(比如MySQL)
将数据重新刷新一份到HDFS上
hdfs fsck / delete
# 删除损坏的文件,
# 然后重刷一份到HDFS
数据没办法从其它地方找到
- 查看相应文件的数据块状态及其副本存放的位置
hdfs fsck <file path> -files -locations -blocks -racks
这种方式只能显示出好的副本存放的位置,并不能找到坏的副本存放的位置
找到对应的文件,先下载一份到本地,然后将HDFS上的删除,再重新上传
hdfs dfs -get <path>
hdfs dfs -rm <path>
hdfs dfs -put <loacal path> <HDFS path>
- 如果可以找到损坏的副本位置,可以进行手动修复,先将其删除,然后执行下列命令
删除副本文件,而非hdfs文件
hdfs debug recoverLease -path <path> -retries 10
- 自动修复
在DN向NN进行blockReport的时候,进行自动修复,默认时间间隔是6h。