JDK11+Spark3.2.1执行spark-submit找不到主类报错
Spark3.2.1 + JDK11 环境下
Could not find or load main class org.apache.spark.launcher.Main报错根因 这个报错和你在Maven中添加spark-launcher依赖的操作没有关联:spark-submit启动时优先加载Spark安装目录自带的launcher组件,业务jar中打入的对应依赖不会在启动阶段被加载。你确认jars目录下存在对应jar包仍触发报错,常见原因如下:
SPARK_HOME环境变量配置错误。spark-submit脚本启动时固定读取$SPARK_HOME/jars/*作为启动类路径,如果你在容器Dockerfile中配置的SPARK_HOME路径和Spark二进制包实际存放路径不一致,比如Spark解压在/opt/spark-3.2.1-bin-hadoop3.2但SPARK_HOME写为/opt/spark且未做软链接,脚本会到不存在的路径下扫描依赖,自然无法加载主类。- Spark目录权限配置错误。如果构建镜像时将Spark目录属主设为root,却用普通用户执行spark-submit,且jars目录未开启全局读权限,类加载器就无法读取目录下的jar包。这种场景下用root用户进入容器能看到jar包存在,但实际运行任务的用户没有文件访问权限。排查时直接切到运行spark-submit的用户,执行
ls $SPARK_HOME/jars/spark-launcher*,如果报权限不足即可确认问题。 - 构建镜像时意外覆盖Spark原生依赖。如果将Maven打出的业务fat jar直接拷贝到
$SPARK_HOME/jars目录下,且业务jar中包含org.apache.spark.launcher包下的类文件,类加载时可能优先加载业务jar内的不匹配launcher类:Spark3.2.1默认用Scala2.12编译,如果你引入的spark-launcher是Scala2.13版本、或者和3.2.1小版本不匹配,就会触发类加载失败。 - 自定义JRE11裁剪缺失依赖。如果构建镜像时用jlink生成了裁剪版JRE11,漏加
java.logging、java.naming等Spark启动必需的JDK模块,会导致launcher主类加载过程中因依赖缺失抛出错误,容易被误判为主类本身不存在。可以用全量JDK11基础镜像做对照测试,若全量环境下提交正常即可定位为JRE裁剪问题。 - Spark安装包本身残缺。镜像构建过程中文件拷贝中断、使用的Spark二进制包源文件损坏,都会导致spark-launcher jar包本身不完整。可以直接解压对应jar包,检查包内是否存在
org/apache/spark/launcher/Main.class文件确认完整性。
内容的提问来源于stack exchange,提问作者Jayasree
相关产品推荐
相关产品推荐

