项目场景:
spark-streaming流式任务跑一段时间就挂了报错:
Uncaught exception while reverting partial writes to file /opt/newdisk6/yarn/nm/usercache/test/appcache/application_1712721630192_5804/blockmgr-0edcb941-fd6d-4ed3-9242-510a8985d9ae/31/temp_shuffle_6c854f65-2a3f-4701-8c9d-157517c96cd3/ **java.nio.channels.ClosedByInterruptException**
问题描述
spark-streaming流式任务跑一段时间就挂了报错:
1.每次重启能好去,2个小时 任务 跑了之后有数据
2.之后会经常挂掉,写不进数据到hdfs
3.报错如上,cdh没有告警,看不出原因
原因分析:
1.确定是中台程序bug还是数据底座cdh的问题
通过查看日志发现yarn日志先报错,中台程序后报错,由此判断是yarn大数据底座组件的问题导致的任务失败
以下是yarn application日志第一个错误点出现的时间点是 09:10:43
24/04/11 09:10:43 ERROR storage.DiskBlockObjectWriter: Uncaught exception while reverting partial
以下是中台程序的报错,后面的信息也都是表面信息不记录了:
09:11:15 ERROR .............
2.确实是cdh组件的问题,于是看cdh监控有没有不健康的告警。发现没有问题,无告警,各组件
3.根据以上报错,百度发现大部分讲的是磁盘空间不足导致的,如图
链接:网上的解决办法-原因跟我的情况不符合这里是链接
4.排查每个节点磁盘空间,发现每个磁盘空间根目录只有20G,这里的规划很不好,很容易出现问题,因为目录到10个g cdh就会告警。大家根目录的规划尽量在50G吧,磁盘是很便宜的,没必要在这里省钱。。为此跟领导反映了此问题,这里是个问题但还不是我们这个情况的根本原因。。继续排查
5.清理了磁盘后,发现仍然会经常失败,报错仍然一样,没有变化。还是一样只说了java中断,并没有说因为什么而中断
Uncaught exception while reverting partial writes to file /opt/newdisk7/yarn/nm/usercache/test/appcache/application_1712721630192_5804/blockmgr-0edcb941-fd6d-4ed3-9242-510a8985d9ae/31/temp_shuffle_6c854f65-2a3f-4701-8c9d-157517c96cd3/ **java.nio.channels.ClosedByInterruptException**
6.有可能还有一些告警,cdh并没有检测出来,不排除这个可能,cdh强大是强大,但也不一定万能,能检测出所有问题,有时也会发神经,检测不出来。带着这个怀疑,继续去服务器上看yarn 日志报什么错。。这里我找过了,没有实质性进展,。截图,日志忽略
7.查看服务器上的系统日志,每个节点,最终发现有2个节点一直在报错,而且有2个节点报错了:
[root@cdh2 ~]# tail -400f /var/log/messages
报错大致如下,不太记得了,后续补充吧:
10:00:01 localhost kernel: Buffer I/O error on dev sdq1, logical block 123456
8.检测磁盘是否坏道,如下说明磁盘是有坏道的
[root@cdh2 dn]# badblocks -sv /dev/sdq1
Checking blocks 0 to 4064255
Checking for bad blocks (read-only test):
4061255
4062235
3964256
3861235
done
Pass completed, 4 bad blocks found. (4/0/0 errors)
9.从这大致可以判断可能就是磁盘坏了导致的 java.io.InterruptedIOException: Interruped
10.cdh上将坏盘的dir去掉,然后让负责磁盘硬件的同事处理坏掉的磁盘
11.待磁盘更换后,将新的好的磁盘重新加入datanode的dir中,重平衡。
12.任务重新启动,观察5天后没有问题了,最终确定此次故障的报错中断是由磁盘坏掉导致的
解决方案:
提示:已经在上面排查步骤中给出,并验证,请查阅以上步骤
总结: Uncaught exception while reverting partial…java.nio.channels.ClosedByInterruptException 报错的根本原因还是因为磁盘坏道导致。