You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes上Spark Driver进程无法终止及YARN对比咨询

Spark作业从YARN迁移至Kubernetes的Driver进程终止问题

问题详情

我在把现有Spark作业从YARN迁移到Kubernetes时碰到了问题:Spark Driver进程在main方法执行完毕、Spark Context也停止后,依然无法终止。

JVM进程终止需要触发关闭序列,触发方式有两种:

  • 所有非守护线程(non-daemon threads)执行完成;
  • 显式调用System.exit方法。

为了定位问题,我打印了main方法结束时仍在运行的非守护线程列表:

  • Kubernetes环境:包含main线程、K8s运行的两个OkHttp线程(停止Spark Context后会终止)、若干用户线程;
  • YARN环境:包含main线程、Driver(ApplicationMaster线程)、与K8s环境相同的若干用户线程。

有意思的是,虽然两种环境都存在用户线程,但YARN的JVM会正常终止,Kubernetes的却不会。经过分析发现,YARN集群模式下,Spark是通过ApplicationMaster类实例启动Driver JVM的,ApplicationMaster会在独立线程中调用用户的Main类,等Main线程结束后就调用System.exit触发JVM关闭序列;但Kubernetes环境中没有类似的机制。

咨询问题

  1. YARN的这种行为是否符合预期?
  2. 我们应该在用户main类中调用System.exit(),还是优雅关闭所有用户线程?

内容的提问来源于stack exchange,提问作者Atulit Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:14:56