Spark 2.3.0以YARN为Master运行时找不到ApplicationMaster主类报错求助
Could not find or load main class org.apache.spark.deploy.yarn.ApplicationMaster问题 从你的描述来看,Spark在local模式运行正常,但切换到YARN cluster模式时出现主类找不到的错误,这通常是YARN节点无法正确获取Spark依赖类路径导致的。结合你的Spark 2.3.0 + Hadoop 2.7.5环境,我给你整理了几个针对性的排查和解决步骤:
1. 确认Spark安装包的依赖完整性
首先要确保你下载的Spark是适配Hadoop 2.7的预编译版本(比如spark-2.3.0-bin-hadoop2.7.tgz),而不是源码包或通用版本。如果是手动编译的Spark,要确认编译时指定了正确的Hadoop版本参数:
./build/mvn -Pyarn -Phadoop-2.7 -DskipTests clean package
同时检查$SPARK_HOME/yarn目录下是否存在spark-2.3.0-yarn-shuffle.jar这类YARN核心依赖包,从你的日志看已经在上传这个文件,但如果文件损坏或者权限不足也会出问题。
2. 配置Spark YARN全局类路径
修改$SPARK_HOME/conf/spark-defaults.conf,添加以下配置,让YARN从HDFS加载Spark的所有依赖jar包:
spark.yarn.jars=hdfs://localhost:9000/spark-jars/*
操作步骤:
- 先把
$SPARK_HOME/jars下的所有jar包上传到HDFS的指定目录:
这样所有NodeManager节点都能从HDFS统一获取依赖,避免本地路径不一致的问题。hdfs dfs -mkdir -p /spark-jars hdfs dfs -put $SPARK_HOME/jars/* /spark-jars/
3. 检查NodeManager节点的环境变量
在cluster模式下,ApplicationMaster是在NodeManager节点上启动的,所以必须确保所有NodeManager节点都正确配置了以下环境变量:
SPARK_HOME:指向你的Spark安装目录HADOOP_CONF_DIR:指向Hadoop的配置目录(比如/opt/hadoop-2.7.5/etc/hadoop)
你可以登录到NodeManager节点,执行以下命令验证:
echo $SPARK_HOME echo $HADOOP_CONF_DIR
如果这些变量未配置,需要修改NodeManager的启动脚本(比如$HADOOP_HOME/etc/hadoop/yarn-env.sh),添加环境变量配置。
4. 排查HDFS资源上传问题
从你的控制台日志中看到了DFSClient: Caught exception java.lang.InterruptedException的警告,这可能意味着Spark的配置包或依赖jar包没有完整上传到HDFS的staging目录。你可以手动检查HDFS路径:
hdfs dfs -ls /user/root/.sparkStaging/application_1526143826498_0001/
确认__spark_conf__.zip、spark-2.3.0-yarn-shuffle.jar和你的应用jar包是否存在且大小正常。如果文件缺失,检查HDFS的磁盘空间和用户权限,确保root用户对该目录有读写权限。
5. 快速验证:切换到Client模式测试
尝试用client模式提交任务,看看是否能正常运行:
spark-submit --class com.spark.SparkTest --master yarn --deploy-mode client /root/Downloads/SimpleSpark-0.0.1-SNAPSHOT.jar
如果client模式正常,说明问题确实出在cluster模式下NodeManager的环境或类路径配置上,再针对性排查NodeManager的配置即可。
内容的提问来源于stack exchange,提问作者aiman

