Spark on YARN部署报错:无法找到ApplicationMaster主类求助
解决YARN集群模式下Spark提交任务报错:Could not find or load main class org.apache.spark.deploy.yarn.ApplicationMaster
问题描述
使用Hadoop 3.3.6 + Spark 3.4.1,以YARN集群模式提交Python机器学习任务时,应用因AM Container退出(退出码1)失败2次,日志核心报错:
Error: Could not find or load main class org.apache.spark.deploy.yarn.ApplicationMaster
提交命令:
spark-submit --master yarn --deploy-mode cluster --num-executors 1 --executor-cores 3 --executor-memory 6g "C:\Users\UCKAN\Desktop\Python_Codes\Demo-Churn\BigDataML.py"
Spark会话配置:
import pyspark from pyspark.sql import SparkSession from pyspark.conf import SparkConf from pyspark import SparkContext import pandas as pd spark = SparkSession.builder \ .master("yarn") \ .appName("churn_modellemesi") \ .config("spark.executor.memory", "6g") \ .config("spark.executor.instances", "1") \ .config("spark.executor.cores", "2") \ .config("spark.dynamicAllocation.enabled", "true") \ .config("spark.driver.memory", "4g") \ .config("spark.shuffle.service.enabled", "true") \ .getOrCreate()
已验证:
- 环境变量
HADOOP_HOME、SPARK_HOME、HADOOP_CONF_DIR配置正确 spark-env.cmd中已定义HADOOP_CONF_DIR- Spark独立模式提交应用正常
可能原因及解决方案
1. Spark的YARN依赖包未正确分发到HDFS
YARN集群模式下,Spark需要将自身依赖包上传到HDFS供ApplicationMaster和Executor调用。若未配置自动上传或上传失败,会导致类加载失败。
解决步骤:
- 手动将Spark jar包上传到HDFS(替换
hdfs://your-nn-host:port/path/to/spark-jars为你的HDFS路径):
hdfs dfs -mkdir -p /spark/jars hdfs dfs -put $SPARK_HOME/jars/* /spark/jars/
- 提交命令中添加
--conf spark.yarn.jars=hdfs://your-nn-host:port/spark/jars/*指定依赖路径,或在spark-defaults.conf中配置该参数永久生效。
2. Spark与Hadoop版本兼容性问题
Spark 3.4.1官方支持Hadoop 3.3.x,但预编译包版本不匹配会引发适配问题。
解决步骤:
- 确认使用的Spark预编译包为
spark-3.4.1-bin-hadoop3.tgz(对应Hadoop 3.x版本),而非适配Hadoop 2.x的包。 - 若自行编译Spark,重新指定Hadoop版本编译:
./build/mvn -DskipTests -Dhadoop.version=3.3.6 package
3. YARN的classpath缺失Spark路径
YARN启动脚本中未包含Spark jar包路径,导致ApplicationMaster无法加载指定类。
解决步骤(Windows环境):
- 编辑
HADOOP_HOME/etc/hadoop/yarn-env.cmd,添加:
set YARN_CLASSPATH=%YARN_CLASSPATH%;%SPARK_HOME%\jars\*
- 重启YARN服务。
4. 提交命令与代码配置冲突
提交命令中--executor-cores 3与代码内spark.executor.cores=2参数冲突,可能引发资源分配异常,间接导致类加载失败。
解决步骤:
- 统一配置来源:要么完全通过提交命令指定资源参数,要么在代码中配置,删除重复冲突的配置项。例如删除代码内的
spark.executor.instances、spark.executor.cores、spark.executor.memory配置,由提交命令统一控制。
5. Windows路径格式适配问题
Windows本地路径(带盘符、反斜杠)在跨平台集群(含Linux节点)中无法被YARN正确识别,导致脚本或依赖加载失败。
解决步骤:
- 将Python脚本上传到HDFS,使用HDFS路径提交:
hdfs dfs -put "C:\Users\UCKAN\Desktop\Python_Codes\Demo-Churn\BigDataML.py" /user/uckan/ spark-submit --master yarn --deploy-mode cluster --num-executors 1 --executor-cores 3 --executor-memory 6g hdfs://your-nn-host:port/user/uckan/BigDataML.py
- 若集群全为Windows节点,将路径改为正斜杠或双反斜杠转义格式。
内容的提问来源于stack exchange,提问作者Deniz Uckan
相关产品推荐
相关产品推荐

