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