SQL执行偶发报错:org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block

  其他常见问题
内容纲要

概要描述


执行SQL跑批时,会偶发的报错: org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block ,重新执行时可以成功执行,发生该问题时可以参考以下排查步骤。

file

详细说明


检查hdfs状态是否正常

通过 hdfs fsck / 命令检查hdfs是否真的有块丢失或损坏;根据下面截图所示,hdfs的文件和目录都处于健康状态。

file

检查是否能get到报错信息中提示的文件

执行hdfs命令将hdfs文件get到本地;根据下面截图所示,hdfs的文件可以正常get到本地

hdfs dfs -get /inceptor1/user/hive/warehouse/sdm.db/hive/s_assessment_instance_new/base_2066065/bucket_00063

file

确定报错block所在的datanode,查看详细报错日志

执行hdfs命令找到报错的block所在的datanode节点;根据下面截图所示,hdfs的block所在的datanode节点是: 158.1.233.83、158.1.233.80、158.1.233.77

hdfs fsck /inceptor1/user/hive/warehouse/sdm.db/hive/s_assessment_instance_new/base_2066065/bucket_00063

file

登录上面3个datanode节点查看datanode的日志:/var/log/hdfs1/hadoop-hdfs-datanode-xxx.log,可以看到日志中有其他的报错信息:DataXceiverServer: java.io.IOException:Xceiver count 6145 exceeds the limit od concurrent xcievers:6144

file

解决方案

根据上述报错,可以确定是请求线程数大于现有配置的 6144,所以抛了异常;

检查参数 dfs.datanode.max.transfer.threads 的值,如果没有额外配置的话,该值默认是 4096 ,可以在manager页面的hdfs参数配置中查看下是否有额外配置。

file

根据下面截图可以看到,有额外配置改参数的值为 6144 ,与datanode日志中提示的一样,将该值调大到 8192 ,然后配置 hdfs 服务,并重启 hdfs 之后,问题解决。

file

这篇文章对您有帮助吗?

平均评分 0 / 5. 次数: 0

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。