一個datanode長期掛掉的後,重新運行spark程序報錯
java.io.IOException:Cannot obtain block length for LocatedBlock
解決方法:
在Hadoop測試集羣運行job的過程中發現部分運行失敗,有Cannotobtain block length for LocatedBlock,使用hdfs dfs -cat${文件}的時候也報這個錯,看過代碼後發現是文件未被正常關閉(flume傳到hdfs上的,可能由於Namenode長時間gc或者切換或者重啓會留下很多.tmp結尾的文件),爲此,使用hadoop命令顯示處於打開狀態的文件,然後刪除這些文件:
hadoop fsck /-openforwrite | egrep -v '^\.+$' | egrep "MISSING|OPENFORWRITE" |grep -o "/[^ ]*" | sed -e "s/:$//" | xargs -i hadoop fs-rmr {};
然後重傳這些文件到hdfs。