HDFS块丢失
后台检查详细问题
hdfs fsck -list-corruptfileblocks
// 列出所有有问题的块
hdfs fsck /apps/hive/** -list-coruptfileblocks
// 列出 /apps/hive/** 中有问题的块,可以是目录也可以是文件
hdfs fsck / -delete
// 删除根目录下所有有问题块的文件,path可更改
hdfs fsck path -files -blocks -locations
// 查看 path 文件的块的信息,位置,还可以机架(-racks)
1 | [root@master tmp]# hdfs fsck /apps/hive/warehouse/yibuwatch.db/t_location/partdate=date20190808/part-m-00000-MYSQL_SERVICE_DATA-mgw_84_v4_191.1565279433 -list-corruptfileblocks |
可以看出,确实这个文件有问题。那么看一下丢失的块是哪个
1 | hdfs fsck /apps/hive/warehouse/yibuwatch.db/t_location/partdate=date20190808/part-m-00000-MYSQL_SERVICE_DATA-mgw_84_v4_191.1565279433 -files -blocks -locations |
可知,第37个块 MISSING。
解决方案和思路
这个MISSING有两种情况
块以及副本确实全都丢了,这种只能把块(文件)删了以解决问题
块的连接丢了,但是副本信息还在。
无论如何,发生了块MISSING时,应先尝试把对应的文件 get 到本地,如果能成功最好,不成功就准备删块。
如果成功的话,就将文件保留在本地,然后使用
hdfs fsck filePath -delete
删除该文件,然后将本地的数据文件重新 put 到HDFS。如果不成功,同时文件不重要或者有备份,直接删除文件,然后重新上传数据。
如果不成功,同时本地无备份,只能选择删除块了。
hdfs fsck path -files -blocks -locations
能看到丢失块的具体信息,如1
37. BP-1440124469-192.168.1.1-1466135627881:blk_1536251272_4849869877 len=133158089 MISSING!
去对应的机器(192.168.1.1)上查找
BP-1440124469-192.168.1.1-1466135627881
1
find / -name "BP-1440124469-192.168.1.1-1466135627881"
进入查找到的目录,找到
blk_1536251272_4849869877 len=133158089
文件,删除!
修复未正常关闭文件
hdfs debug recoverLease -path <path> [-retries <num-retries>]