HDFS坏块解决方案

问题描述:

flume采集文件到hdfs,从hdfs的接口层同步数据,结果发现报错:Caused by: java.io.IOException: Cannot obtain block length for LocatedBlock{BP-531411289-172.31.57.12-1539657748238:blk_1092550462_18814501; getBlockSize()=3442; corrupt=false; offset=0; locs=[DatanodeInfoWithStorage[172.31.57.12:50010,DS-e2c41f07-31b3-4f71-9ecd-0074a3147395,DISK], DatanodeInfoWithStorage[172.31.61.37:50010,DS-218a03f0-d268-4b53-ae56-52613c4b8648,DISK]]}

具体错误如下图所示:

HDFS坏块解决方案_第1张图片

问题分析:

由运行日志可以看出,文件块BP-531411289-172.31.57.12-1539657748238出现了未知异常,导致namenode不能获取该文件块的信息,该文件块是由flume采集数据然后写入到hdfs的接口层,查询运维日志发现hdfs在此时有发生重启!

问题排查:

查看文件块相关信息:

hdfs fsck /user/hive/warehouse/ufoto_bigdata_src.db/src_api_hour_user_act_log/day_part=20190630/hour_part=03

HDFS坏块解决方案_第2张图片

发现文件块并未异常,那么我们继续检查:(由于本文写在问题解决之后,原来文件已经被修复,所以用另一个表的数据进行了复现,结果相似)

hdfs fsck /user/hive/warehouse/ufoto_bigdata_src.db/src_api_hour_user_act_log/day_part=20190630/hour_part=03 -openforwrite

HDFS坏块解决方案_第3张图片

由上面我们可以看到文件平均副本不足3,确实由文件块为坏块状态;那么接下来我们就要修复文件坏块

优先采用恢复文件块形式:

hdfs debug recoverLease -path /user/hive/warehouse/ufoto_bigdata_src.db/src_api_hour_game_square_log/day_part=20190630/hour_part=03/log_game_square_20190630_03.1561865579388.lzo -retries 1

如果恢复文件块失败,分为以下情况:

第一:文件可以恢复状态:直接将该文件上传覆盖对应目录文件即可

第二:文件不可恢复状态:

(1)删除文件坏块,

hdfs fsck -delete /user/hive/warehouse/ufoto_bigdata_src.db/src_api_hour_user_act_log/day_part=20190630/hour_part=03/file_name

(2)hdfs dfs get /user/hive/warehouse/ufoto_bigdata_src.db/src_api_hour_user_act_log/day_part=20190630/hour_part=03/

         由于get操作命令会将正确的文件块下载下来,所以可以直接忽略掉坏块,避免了查找文件坏块的步骤

        hdfs dfs -rm  /user/hive/warehouse/ufoto_bigdata_src.db/src_api_hour_user_act_log/day_part=20190630/hour_part=03/*

        hdfs dfs -put  /user/hive/warehouse/ufoto_bigdata_src.db/src_api_hour_user_act_log/day_part=20190630/hour_part=03

你可能感兴趣的:(hadoop)