M1 Mac上使用Fat Jar执行spark-submit时类加载失败问题排查
Spark Submit 类加载失败(com.sd.proj.executables.HelloSpark)排查指南
针对你在M1 macOS 13上遇到的Spark HelloWorld应用类加载失败问题,按以下步骤逐一排查:
1. 验证Fat Jar内容
先确认打包出来的Jar包确实包含目标类:
jar tf 你的FatJar文件名.jar | grep com.sd.proj.executables.HelloSpark
- 如果没有任何输出,说明Gradle打包时未将编译后的类文件纳入Jar包,问题出在构建配置。
- 如果有输出(显示类似
com/sd/proj/executables/HelloSpark.class的路径),说明类已在Jar中,继续排查其他点。
2. 检查Gradle构建配置(build.gradle)
2.1 主类配置
确认主类路径设置准确,不同Gradle版本写法略有区别:
// Gradle 7以下版本 mainClassName = "com.sd.proj.executables.HelloSpark" // Gradle 7及以上版本 application { mainClass.set("com.sd.proj.executables.HelloSpark") }
2.2 Fat Jar插件配置
如果使用Shadow插件(com.github.johnrengelman.shadow):
- 确保插件已正确应用:
plugins { id 'com.github.johnrengelman.shadow' version 'x.x.x' } - 检查
shadowJar任务是否错误排除了目标类所在包,比如是否存在exclude 'com/sd/proj/**'这类配置 - 确认编译后的类目录(默认
build/classes/scala/main)被包含在ShadowJar的输入范围内
2.3 Scala编译配置
确认源码目录配置正确,保证Scala代码能被正常编译:
sourceSets { main { scala { srcDirs = ['src/main/scala'] } } }
3. 核对项目结构
Scala类的包名必须和源码路径严格对应:
- 类
com.sd.proj.executables.HelloSpark的源码文件必须放在src/main/scala/com/sd/proj/executables/HelloSpark.scala - 如果路径与包名不匹配(比如源码放在
src/main/scala/HelloSpark.scala但包名仍为com.sd.proj.executables),编译后类文件的目录结构会和包名脱节,导致Spark找不到类
4. 检查spark-submit命令
4.1 类名和Jar路径
- 确认命令中的类名完全正确:注意大小写(Scala类名首字母大写,包名全小写),不要多打或少打字符
- 确认Jar包路径正确:如果用相对路径,确保当前终端工作目录是Jar包所在目录;如果路径包含空格,需要用引号包裹(比如
"./my spark app.jar")
4.2 M1架构兼容性
M1为ARM架构,若使用x86版本的Spark,可尝试:
- 用Rosetta打开终端(右键终端→显示简介→勾选“使用Rosetta打开”)后再运行spark-submit
- 添加JVM参数:
--conf spark.driver.extraJavaOptions="-Djava.awt.headless=true" - 建议使用Spark 3.2及以上版本,对ARM架构支持更完善
5. 分析错误日志
如果以上步骤都没问题,把完整错误日志中的堆栈信息贴出来,重点排查:
- Jar包是否损坏(比如打包过程中断)
- 是否存在依赖冲突(Spark依赖与Jar包内依赖版本不一致)
- 类加载器权限异常(M1环境下极少出现,但需留意)
内容的提问来源于stack exchange,提问作者dsam05
相关产品推荐
相关产品推荐

