Spark界面Job进度不更新问题分析

举报
小兔子615 发表于 2021/12/31 19:23:54 2021/12/31
【摘要】 问题现象:Stage ID: 298056,实际已经完成,但是进度条显示仍有47个task正在执行中。内存dump信息:Stage信息:完成的task数为0,执行中的task数为47,总共的task数为50,该stage的状态为ACTIVE,不是完成状态。LiveTasks信息:该Stage的50个task中,有38个活跃task,表明还有38个task处于未完成状态,但从日志中可以知道,该...
  1. 问题现象:
    image.pngimage.png

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

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。