You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 08:25:21