一个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。