Spark Session初始化报错:NoSuchMethodError问题排查求助
问题:IntelliJ中初始化Spark Session抛出NoSuchMethodError错误
错误信息
Exception in thread "main" java.lang.NoSuchMethodError: 'void org.apache.spark.internal.Logging.$init$(org.apache.spark.internal.Logging)'
at org.apache.spark.sql.SparkSession$.(SparkSession.scala:787)
at org.apache.spark.sql.SparkSession$.(SparkSession.scala)
执行代码
val conf = new SparkConf().setMaster("local[*]").setAppName("MTBD") val spark = SparkSession .builder() .appName("MTBD") .config(conf) .getOrCreate()
环境信息
scala -version Scala code runner version 2.11.12 spark version 3.2.2
build.sbt配置:
ThisBuild / version := "0.1.0-SNAPSHOT" ThisBuild / scalaVersion := "2.11.12" lazy val root = (project in file(".")) .settings( name := "provaMTBD" ) libraryDependencies ++= Seq( "org.apache.spark" % "spark-core_2.11" % "2.1.0")
补充信息
在spark-shell中执行相同代码无报错,输出如下:
val spark = SparkSession.builder().appName("MTBD").config(conf).getOrCreate() 22/10/15 01:14:25 WARN SparkSession$Builder: Using an existing SparkSession; some spark core configurations may not take effect. spark: org.apache.spark.sql.SparkSession = org.apache.spark.sql.SparkSession@5fbcc71d
原因分析
核心问题是Spark版本不兼容:
- 本地环境的Spark版本是3.2.2,但build.sbt中引入的spark-core依赖版本是2.1.0,两个版本差异过大,导致
org.apache.spark.internal.Logging类的初始化方法签名不匹配,触发NoSuchMethodError。 - spark-shell默认使用本地安装的3.2.2版本环境,依赖一致所以正常运行;而IntelliJ项目使用sbt管理的2.1.0版本依赖,与本地Spark环境冲突。
解决方法
- 统一Spark依赖版本:修改build.sbt,将spark-core版本改为3.2.2,同时添加spark-sql依赖(SparkSession属于spark-sql模块,原配置缺失该依赖)。修改后的build.sbt如下:
ThisBuild / version := "0.1.0-SNAPSHOT" ThisBuild / scalaVersion := "2.11.12" lazy val root = (project in file(".")) .settings( name := "provaMTBD" ) libraryDependencies ++= Seq( "org.apache.spark" %% "spark-core" % "3.2.2", "org.apache.spark" %% "spark-sql" % "3.2.2" )
- 刷新sbt依赖:在IntelliJ中点击sbt面板的"Refresh all sbt projects"按钮,重新下载匹配版本的依赖。
- 重启项目并重新编译运行:确保旧依赖被清理,新依赖生效后再执行代码。
内容的提问来源于stack exchange,提问作者mikeman
相关产品推荐
相关产品推荐

