Apache Spark快速入门提交Jar包时遇scala/Serializable缺失错误求助
Spark提交Jar包时出现scala/Serializable找不到的问题
操作场景
按照Spark官方Scala版快速入门指南操作,最后一步提交Jar包时失败,执行的命令如下:
# Use spark-submit to run your application $ YOUR_SPARK_HOME/bin/spark-submit \ --class "SimpleApp" \ --master local[4] \ target/scala-2.12/simple-project_2.12-1.0.jar
报错信息
Exception in thread "main" java.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: scala/Serializable at SimpleApp$.main(SimpleApp.scala:9) at SimpleApp.main(SimpleApp.scala) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52) at org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:958) at org.apache.spark.deploy.SparkSubmit.doRunMain$1(SparkSubmit.scala:180) at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:203) at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:90) at org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:1046) at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:1055) at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) Caused by: java.lang.NoClassDefFoundError: scala/Serializable ... 14 more Caused by: java.lang.ClassNotFoundException: scala.Serializable at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 14 more
原因分析
这个异常核心是Scala标准库类无法被加载,常见触发原因有三个:
- 项目打包时未包含Scala依赖:默认sbt打包仅包含自定义代码,不会自动打包Scala标准库和Spark依赖,导致运行时找不到核心类
- Scala版本不匹配:项目编译用的Scala版本(如示例中的2.12)和Spark安装包自带的Scala版本不一致,引发依赖冲突或类找不到问题
YOUR_SPARK_HOME配置错误:环境变量指向的Spark目录不正确,导致spark-submit无法加载Spark自带的Scala依赖包
解决办法
统一Scala版本
查看Spark版本对应的Scala版本(如Spark 3.3.x及以上默认用Scala 2.12,Spark 3.0-3.2支持2.11/2.12),修改项目build.sbt中的Scala版本与Spark保持一致,示例:scalaVersion := "2.12.15" // 替换为Spark自带的Scala版本打包包含所有依赖
使用sbt的assembly插件打包成包含所有依赖的fat jar,步骤如下:- 在
project/plugins.sbt中添加插件:addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "1.2.0") - 执行
sbt assembly命令,生成的jar包路径为target/scala-<版本>/simple-project-assembly-1.0.jar,用该包提交:YOUR_SPARK_HOME/bin/spark-submit \ --class "SimpleApp" \ --master local[4] \ target/scala-2.12/simple-project-assembly-1.0.jar
- 在
检查Spark环境变量
执行echo $YOUR_SPARK_HOME确认环境变量指向正确的Spark安装目录,查看该目录下lib文件夹是否存在scala-library-xxx.jar等Scala相关依赖包。
内容的提问来源于stack exchange,提问作者MystCabe
相关产品推荐
相关产品推荐

