Spark界面Job进度不更新问题分析
【摘要】 问题现象:Stage ID: 298056,实际已经完成,但是进度条显示仍有47个task正在执行中。内存dump信息:Stage信息:完成的task数为0,执行中的task数为47,总共的task数为50,该stage的状态为ACTIVE,不是完成状态。LiveTasks信息:该Stage的50个task中,有38个活跃task,表明还有38个task处于未完成状态,但从日志中可以知道,该...
- 问题现象:
Stage ID: 298056,实际已经完成,但是进度条显示仍有47个task正在执行中。 - 内存dump信息:
Stage信息:
完成的task数为0,执行中的task数为47,总共的task数为50,该stage的状态为ACTIVE,不是完成状态。
LiveTasks信息:
该Stage的50个task中,有38个活跃task,表明还有38个task处于未完成状态,但从日志中可以知道,该stage的所有task都执行完毕了。 - 代码逻辑:
onTaskEnd负责处理每个task结束后task信息的更新,并且同时会更新所属的stage的信息。现在task信息更新没有问题,livetasks中仍有38个task,说明仅仅有12个task完成了onTaskEnd的流程。
像上追溯,SparkListenerBus并没有将SparkListenerTaskEnd消息推送给指定的AppStatusListener,于是,我们可以知道,该SparkListenerBus并未收到部分TaskEnd消息。向ListenerBus推送消息的是AsyncEventQueue的post方法,该方法会将消息添加到ListenerBus的消息队列eventqueue中:
Eventqueue有容量限制,如果容量满了,放不下的消息就会被丢弃,也就无法触发后续的消息处理逻辑。如果有消息被丢弃,可以从日志里面看到丢弃消息的相关日志:
我们成功的从日志里面找到了大量的消息丢弃的日志,这可以说明,消息队列的容量已经满了,处理速度赶不上消息到来的速度。 - 解决方案:
当消息的处理速度赶不上消息到来的速度时,消息队列就必须要有足够的容量来缓存这些消息,通过设置参数spark.scheduler.listenerbus.eventqueue.capacity来决定eventqueue的容量,默认值为10000,可以设置为100000。
另外,心跳如果太过频繁,也会占用消息队列的位置,需要适当降低心跳的频率,通过设置参数spark.executor.heartbeatInterval来控制executor到driver的心跳间隔,默认值为10s,如果设置的值小于默认值,建议修改为默认值10s。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)