为什么我的Databricks Spark作业所有任务完成后仍未结束?
该异常的常见触发原因
这类状态的本质是所有Exec节点上的计算任务确实已经跑完,但Driver侧的收尾流程没有正常执行完成,且这些收尾流程完全不占用Exec的运行中Task槽位,因此UI上会显示运行中任务数为0、但命令整体卡在运行状态,常见诱因包括:
- 大结果集回传阻塞:如果代码中使用了
collect()、toLocalIterator()、show()这类会将全量计算结果拉回Driver的操作,所有Exec任务完成后,Driver会处于等待网络传输、序列化全量结果的阶段,这个过程没有对应的运行中Task计数。碰到结果集过大、节点间传输带宽不足的情况,会出现长时间无进展的卡顿。 - 存储层收尾操作阻塞:
- 使用Delta Lake的作业在所有Task写入完成后,需要在Driver侧执行事务日志合并、元数据提交、临时文件清理操作,如果碰到元数据锁竞争、对象存储列表接口响应超时,整个提交流程会直接卡住。
- 写外部数据源(JDBC、第三方对象存储、Hive分区表)时,Task完成后Driver需要执行连接关闭、事务提交、分区元数据更新操作,若对端服务无响应,Driver会一直等待直到触发超时阈值。
- Shuffle资源清理阻塞:所有Task结束后,Driver会协调所有关联Exec清理对应作业的shuffle临时文件。如果某个Exec已经失联、但还未达到心跳超时的判定阈值,Driver会持续等待该Exec的清理响应,不会主动将作业标记为完成。
- 执行指标上报阻塞:Spark作业的运行时指标、SQL执行计划统计需要上报到内部作业追踪服务,若碰到追踪服务负载过高、节点间网络抖动,Driver会卡在指标上报的回调逻辑中,无法触发作业完成的状态切换。
- Notebook执行上下文依赖阻塞:Notebook的「运行命令中」状态判定不单独依赖触发的Spark作业完成,还会等待同执行上下文下关联的所有后台任务(比如自动缓存清理、迷你流批触发任务)全部结束。如果其中某个后台任务在等待资源释放,哪怕主计算作业已经跑完,命令状态也不会切换。
排查需查看的核心日志
按排查优先级排序,需要重点检查以下日志模块:
- Driver节点全量日志:作为第一优先级排查对象,重点过滤
Job finished、Lock acquire、Collecting rows、Shuffle cleanup类关键字,定位日志最后停滞的操作节点,确认Driver具体卡在哪个收尾逻辑上。 - Spark作业Event Log:从集群持久化的event log存储中导出对应作业的事件流,核对事件序列是否停在所有Task结束后、缺失
JobEnd类的完成事件,定位中间卡住的逻辑节点。 - Notebook执行上下文日志:打开Notebook关联的执行上下文面板查看日志,确认是否存在上下文级别的资源锁竞争、内存OOM但未抛出显式异常的情况,是否有同上下文下的其他后台任务未正常结束。
- Metastore操作日志:如果排查发现卡点在元数据提交阶段,查看Metastore的操作记录,确认是否存在对应事务的锁等待、请求无响应的问题。
- 关联Exec节点的状态日志:逐台核对作业关联的Exec节点最后日志状态,确认是否存在Exec和Driver心跳断开、但未被标记为失联的情况。
内容的提问来源于stack exchange,提问作者Sreejith Ramakrishnan
相关产品推荐
相关产品推荐

