记录一次集群间使用hadoop自带的distcp同步数据时遇到的问题,结论在最后
同步命令:
sudo -u hive hadoop distcp -Dmapred.job.queue.name=default hdfs://10.0.134.179:8020/tmp/hive-export/backup/ hdfs://10.3.100.101:8020/tmp/hive-export/
以下是部分报错信息:
Error: java.io.IOException: File copy failed: hdfs://10.0.134.179:8020/tmp/hive-export/backup/dm_bak/dm_store_20211201/data/000028_0 --> hdfs://10.3.100.101:8020/tmp/hive-export/backup/dm_bak/dm_store_20211201/data/000028_0
Caused by: java.io.IOException: Couldn't run retriable-command: Copying hdfs://10.0.134.179:8020/tmp/hive-export/backup/dm_bak/dm_store_20211201/data/000028_0 to hdfs://10.3.100.101:8020/tmp/hive-export/backup/dm_bak/dm_store_20211201/data/000028_0
Caused by: org.apache.hadoop.tools.mapred.RetriableFileCopyCommand$CopyReadException: org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block: BP-1605467350-10.0.134.179-1557405721809:blk_1296788124_223048329 file=/tmp/hive-export/backup/dm_bak/dm_store_20211201/data/000028_0
Caused by: org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block: BP-1605467350-10.0.134.179-1557405721809:blk_1296788124_223048329 file=/tmp/hive-export/backup/dm_bak/dm_store_20211201/data/000028_0
分析过程
一开始以为是块丢失,从报错信息中随便挑选一个目录,用命令查看损坏的块
检测缺失块
hdfs fsck -list-corruptfileblocks
hdfs fsck / | egrep -v '^\.+$' | grep -v eplica
查看上面某一个文件的情况
hdfs fsck /path/to/corrupt/file -locations -blocks -files
结果都是has 0 corrupt files
搞了挺久,没看出问题,
后来通过我们运维小姐姐的指引
先尝试了关闭对应文件的权限
尝试了还是不行
再后来,使用hadoop get命令,选一个报错的文件导到本地试试
sudo -u hive hadoop fs -get hdfs://10.0.134.179:8020/tmp/hive-export/backup/dm_bak/dm_store_20211201/data/000024_0 /tmp
结果报错连接超时
进一步细看发现
上图的IP并不是我distcp访问的机器10.0.134.179,而是一台datanode,
所以问题出在
虽然能访问通namenode,10.0.134.179
但是DataNode不通,所以取数据时,拿不到
所以报错
自己粗心大意,实际上问题很简单,但是只看到了表面的报错
结论
这样报错的原因可能有:
- 块损坏,那就找到相应损坏的块,不重要就删掉
- 文件设置了权限校验
- 集群之间的网络不通,或者只有部分机器能通信