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环境中没有类似的机制。
咨询问题
- YARN的这种行为是否符合预期?
- 我们应该在用户main类中调用
System.exit(),还是优雅关闭所有用户线程?
内容的提问来源于stack exchange,提问作者Atulit Kumar
相关产品推荐
相关产品推荐

