使用SBT Assembly JAR执行spark-submit时主类找不到(ClassNotFoundException)
解决Spark Submit找不到主类sparkpoc.KinesisExample的问题
我之前也踩过类似的坑,结合你的情况,咱们一步步排查解决:
1. 先确认主类是否真的被打包进Assembly JAR
这是最关键的第一步,用命令查看JAR包内容:
jar tf ~/git/ming-spark-poc/target/scala-2.11/ming-spark-poc-assembly-0.1.jar | grep sparkpoc/KinesisExample
如果没有任何输出,说明主类根本没被打包进去,问题出在编译或SBT配置环节;如果能看到sparkpoc/KinesisExample.class,那再往下排查。
2. 检查代码目录结构与包名是否匹配
Scala对源码目录结构有严格要求:
- 你的代码包是
sparkpoc,那么KinesisExample.scala必须放在src/main/scala/sparkpoc/目录下,而不是直接放在src/main/scala/根目录。如果目录结构不对,SBT编译时不会把类放到正确的包路径下,自然找不到。
3. 确认代码能正常编译
先运行sbt compile,然后查看编译后的class文件是否存在:
ls target/scala-2.11/classes/sparkpoc/
如果看不到KinesisExample.class,说明代码有编译错误——比如你贴的代码里impo...明显是截断的import语句,这会导致编译失败,自然不会生成class文件。先把代码补全,确保能正常编译通过。
4. 尝试用SBT直接运行主类,验证代码有效性
在项目目录下执行:
sbt "runMain sparkpoc.KinesisExample"
如果这个命令能正常运行,说明代码和编译环境没问题,问题就出在Assembly打包环节;如果运行失败,先解决编译或依赖问题。
5. 调整SBT Assembly配置
你的assemblyMergeStrategy设置得比较激进,尝试先恢复默认的合并策略,再打包试试:
assemblyMergeStrategy in assembly := { case PathList("META-INF", xs @ _*) => xs match { case ("MANIFEST.MF" | "INDEX.LIST" | "DEPENDENCIES") :: _ => MergeStrategy.discard case _ => MergeStrategy.first } case _ => MergeStrategy.first }
另外,确保assembly.sbt放在project/目录下(不是项目根目录),SBT才能加载到这个插件。
6. 简化spark-submit命令试试
去掉类名的引号,有时候引号可能会导致解析问题:
./bin/spark-submit --class sparkpoc.KinesisExample --master local[4] ~/git/ming-spark-poc/target/scala-2.11/ming-spark-poc-assembly-0.1.jar
内容的提问来源于stack exchange,提问作者Ming
相关产品推荐
相关产品推荐

