IntelliJ中Scala-Spark应用运行SparkConf找不到报错求助
解决IntelliJ运行Scala Spark应用时的NoClassDefFoundError: org/apache/spark/SparkConf问题
问题详情
执行Scala Spark应用时抛出以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/SparkConf at Main$.main(Main.scala:10) at Main.main(Main.scala) Caused by: java.lang.ClassNotFoundException: org.apache.spark.SparkConf at java.net.URLClassLoader.findClass(URLClassLoader.java:387) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ... 2 more
报错代码行:
val conf = new SparkConf().setAppName("Sample Spark Scala Application")
仅导入SparkConf无报错,sbt配置如下:
ThisBuild / version := "0.1.0-SNAPSHOT" ThisBuild / scalaVersion := "2.12.15" val sparkVersion = "3.2.4" // Note the dependencies are provided libraryDependencies += "org.apache.spark" %% "spark-core" % sparkVersion % "provided" libraryDependencies += "org.apache.spark" %% "spark-sql" % sparkVersion % "provided" libraryDependencies += "org.apache.spark" %% "spark-mllib" % sparkVersion % "provided" lazy val root = (project in file(".")) .settings( name := "untitled4" )
环境变量配置:
ray@Rayquaza-ASUS-TUF-Gaming-F15-FX506HEB-FX566HEB:~$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/usr/lib/jvm/java-8-openjdk-amd64/bin:/usr/spark/spark-3.2.4-bin-hadoop2.7/bin ray@Rayquaza-ASUS-TUF-Gaming-F15-FX506HEB-FX566HEB:~$ echo $JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64 ray@Rayquaza-ASUS-TUF-Gaming-F15-FX506HEB-FX566HEB:~$ echo $SPARK_HOME /usr/spark/spark-3.2.4-bin-hadoop2.7
Spark Shell可正常运行代码,但IntelliJ本地运行失败。
问题原因
sbt中Spark依赖使用了provided范围,该范围表示依赖仅在编译阶段可用,运行时会依赖目标环境(如Spark集群、Spark Shell)提供这些类。但本地直接在IntelliJ中运行main方法时,IntelliJ不会自动将provided范围的依赖加入运行时classpath,导致找不到SparkConf类。
解决方案
方案1:临时调整依赖范围(快速测试)
修改sbt文件中的依赖,移除% "provided",让依赖在编译和运行时都可用:
libraryDependencies += "org.apache.spark" %% "spark-core" % sparkVersion libraryDependencies += "org.apache.spark" %% "spark-sql" % sparkVersion libraryDependencies += "org.apache.spark" %% "spark-mllib" % sparkVersion
修改后重新加载sbt项目,再运行main方法即可。注意:提交Spark集群前需将provided加回,避免打包体积过大。
方案2:配置IntelliJ运行时包含provided依赖
- 打开IntelliJ的
File->Project Structure(快捷键:Ctrl+Alt+Shift+S) - 进入
Modules-> 选中项目模块 -> 切换到Dependencies标签页 - 找到所有标注为
Provided的Spark依赖,双击修改其Scope为Compile或Runtime - 点击
Apply和OK,重新运行main方法
方案3:通过sbt命令行运行(推荐,保持依赖配置不变)
在IntelliJ的Terminal中执行sbt run命令,该命令会自动将provided依赖加入运行时classpath:
sbt run
此方法无需修改sbt配置,既能正常本地运行,又能保持依赖的provided范围,方便后续打包提交集群。
额外验证
你的Spark版本(3.2.4)与Scala版本(2.12.15)匹配(Spark 3.2.x兼容Scala 2.12.x),环境变量配置也无问题,Spark Shell能正常运行是因为它自身已加载所有Spark依赖。
内容的提问来源于stack exchange,提问作者PRATIK CHAPADGAONKAR
相关产品推荐
相关产品推荐

