未创建SparkSession时YARN-cluster模式Spark任务失败原因及容器机制咨询
问题原因解析
这个问题的核心在于YARN-cluster模式下Spark应用的生命周期管理逻辑差异。
当你用YARN-cluster模式提交任务时,Spark应用的main方法是运行在YARN的ApplicationMaster(AM)容器里的。你的代码中,当条件不满足时,main方法直接输出提示就退出了——这会触发Spark的临时资源清理机制,自动删除之前上传到HDFS临时目录(.sparkStaging)里的配置文件(比如__spark_conf__.zip)。
但此时YARN的ApplicationMaster进程还没走完它的正常生命周期流程,它还在尝试读取这些已经被删除的临时配置文件,于是就抛出了FileNotFoundException,最终导致整个任务被YARN标记为失败。
而在YARN-client模式下,main方法是运行在你提交任务的本地机器上的,YARN上的ApplicationMaster只负责管理Executor容器。当本地的main方法退出后,不会影响AM的正常清理流程,所以任务能正常结束。
Spark在YARN上的容器创建机制
我给你拆解一下Spark在YARN上的容器运作流程,这样你能更清晰理解整个逻辑:
- 任务提交阶段:
spark-submit客户端会先把应用jar包、依赖库和Spark配置文件上传到HDFS的临时.sparkStaging目录,供后续容器使用。 - 启动ApplicationMaster容器:YARN的ResourceManager会在某个NodeManager节点上启动ApplicationMaster容器,这个容器里运行的AM进程是整个Spark应用的“大脑”——它负责向ResourceManager申请Executor资源、监控任务状态、协调计算任务。
- 启动Executor容器:当AM申请到足够的Executor资源后,ResourceManager会通知对应NodeManager启动Executor容器。Executor启动后会和AM建立通信,接收并执行具体的计算任务。
- 应用收尾阶段:当
main方法执行完成后,AM会向ResourceManager发送任务完成的信号,然后清理HDFS上的临时文件,最后自己正常退出,YARN标记任务为成功。
你的场景中,main方法提前退出触发了临时文件的提前清理,而AM还在正常运行并尝试访问这些文件,就导致了报错。
快速解决建议
如果想让这种场景在YARN-cluster模式下正常结束,你可以在退出前确保ApplicationMaster能正确收尾:
- 可以在
else分支里添加System.exit(0),显式告知JVM正常退出,让AM能正确识别任务完成状态; - 或者即使没创建SparkSession,也可以尝试调用
SparkContext.getOrCreate().stop()(注意要处理空指针情况),触发Spark的正常收尾流程,避免临时文件被提前删除。
内容的提问来源于stack exchange,提问作者Amit Kumar
相关产品推荐
相关产品推荐

