Hadoop块丢失问题记录

HDFS块丢失

1565310720312

后台检查详细问题

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
2
3
4
5
[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
Connecting to namenode via http://master:50070/fsck?ugi=root&listcorruptfileblocks=1&path=%2Fapps%2Fhive%2Fwarehouse%2Fyibuwatch.db%2Ft_location%2Fpartdate%3Ddate20190808%2Fpart-m-00000-MYSQL_SERVICE_DATA-mgw_84_v4_191.1565279433
The list of corrupt files under path '/apps/hive/warehouse/yibuwatch.db/t_location/partdate=date20190808/part-m-00000-MYSQL_SERVICE_DATA-mgw_84_v4_191.1565279433' are:
blk_1536251272 /apps/hive/warehouse/yibuwatch.db/t_location/partdate=date20190808/part-m-00000-MYSQL_SERVICE_DATA-mgw_84_v4_191.1565279433
The filesystem under path '/apps/hive/warehouse/yibuwatch.db/t_location/partdate=date20190808/part-m-00000-MYSQL_SERVICE_DATA-mgw_84_v4_191.1565279433' has 1 CORRUPT files

可以看出,确实这个文件有问题。那么看一下丢失的块是哪个

1
2
3
4
5
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
...
36. BP-1440124469-192.168.1.1-1466135627881:blk_1536233077_4849844907 len=134217728 repl=3 [DatanodeInfoWithStorage[172.28.199.50:50010,DS-b05716dd-2233-469c-b05d-e20faf9d9bb0,DISK], DatanodeInfoWithStorage[172.28.199.47:50010,DS-83333601-39b3-4898-a340-532ad12322ce,DISK], DatanodeInfoWithStorage[172.28.199.53:50010,DS-7ddba9ed-ece4-4ddb-93aa-058f91ccc3fa,DISK]]
37. BP-1440124469-192.168.1.1-1466135627881:blk_1536251272_4849869877 len=133158089 MISSING!
...

可知,第37个块 MISSING。

解决方案和思路

这个MISSING有两种情况

  • 块以及副本确实全都丢了,这种只能把块(文件)删了以解决问题

  • 块的连接丢了,但是副本信息还在。

无论如何,发生了块MISSING时,应先尝试把对应的文件 get 到本地,如果能成功最好,不成功就准备删块。

  1. 如果成功的话,就将文件保留在本地,然后使用 hdfs fsck filePath -delete 删除该文件,然后将本地的数据文件重新 put 到HDFS。

  2. 如果不成功,同时文件不重要或者有备份,直接删除文件,然后重新上传数据。

  3. 如果不成功,同时本地无备份,只能选择删除块了。

    • 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>]