提交Scala程序至Spark时遭遇java.lang.NoSuchMethodError问题求助
解决Spark提交Scala程序时的java.lang.NoSuchMethodError错误(scala.Predef$.$conforms())
问题详情
提交Scala程序到Spark时触发如下错误:
java.lang.NoSuchMethodError:scala.Predef$.$conforms()Lscala/Predef$$less$colon$less
错误出现在创建SparkSession的代码行:
var spark = SparkSession.builder().enableHiveSupport().getOrCreate()
开发环境:Scala 2.11.12,Spark 2.4.5
问题根源
你引入的hive-exec版本(3.1.0)和Spark 2.4.5不兼容:
- Spark 2.4.5默认依赖Hive 2.3.x版本,而Hive 3.x系列依赖的Scala版本与Spark 2.4.5使用的Scala 2.11存在API差异,导致类加载时找不到目标方法。
- 另外,
spark-hive依赖已经包含了Hive执行所需的核心组件,无需单独添加hive-exec依赖,重复引入只会加剧版本冲突。
修复方案
修改pom.xml中的依赖配置,具体如下:
- 移除单独的
hive-exec依赖,直接使用spark-hive自带的兼容版本; - 提交到集群时,将Spark相关依赖的
scope设为provided,避免和集群环境的依赖冲突。
修改后的依赖片段:
<dependencies> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>2.4.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.11</artifactId> <version>2.4.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-hive_2.11</artifactId> <version>2.4.5</version> <scope>provided</scope> </dependency> </dependencies>
如果确实需要手动引入Hive组件,务必使用和Spark 2.4.5兼容的版本(如Hive 2.3.7),并同样设置scope为provided:
<dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>2.3.7</version> <scope>provided</scope> </dependency>
内容的提问来源于stack exchange,提问作者zhaoji li
相关产品推荐
相关产品推荐

