Spark项目添加spark-streaming依赖后出现java.lang.NoSuchMethodError求助
这个问题我之前帮同事排查过,核心是Spark组件版本不统一加上Scala版本跨版本兼容问题导致的,咱们一步步理清楚:
异常原因分析
Spark组件版本不一致
你原项目用的是Spark 2.4.0,但新增的spark-streaming依赖版本是2.4.2。Spark的核心组件(core、sql、streaming等)必须保持完全相同的版本号——不同小版本之间会存在内部API的细微变更,当代码加载了不同版本的Spark类时,就会出现方法找不到的NoSuchMethodError。Scala版本不匹配
你引入的spark-streaming_2.12是基于Scala 2.12编译的,但Spark 2.4.0官方默认推荐的Scala版本是2.11(2.4.0对Scala 2.12的支持属于实验性阶段,稳定性不如2.11)。如果你的原项目是基于Scala 2.11构建的,跨Scala大版本(2.11 vs 2.12)的依赖会导致字节码不兼容,这就是你看到scala.Product.$init$(Lscala/Product;)V方法找不到的直接原因。
具体解决方案
统一Spark组件版本,匹配Scala后缀
把spark-streaming的版本改成和你原项目Spark一致的2.4.0,同时根据项目使用的Scala版本选择对应的artifactId后缀:<!-- 如果项目用Scala 2.11(推荐) --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming_2.11</artifactId> <version>2.4.0</version> <scope>provided</scope> </dependency> <!-- 如果项目确实用Scala 2.12 --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming_2.12</artifactId> <version>2.4.0</version> <scope>provided</scope> </dependency>校验项目全局Scala版本一致性
检查你的构建文件(比如Maven的pom.xml),确保所有Scala相关依赖的版本后缀和项目指定的Scala版本完全匹配。比如pom.xml里如果有<scala.version>2.11.12</scala.version>,那所有Spark依赖的artifactId都必须是_2.11。清理依赖缓存,重新构建
本地仓库可能存在混合版本的依赖缓存,导致构建时加载错误的类。执行以下命令清理并重新拉取依赖:# Maven项目 mvn clean install -U # SBT项目(如果用SBT的话) sbt clean update额外建议:如果你的项目实际上不需要Spark Streaming功能,直接移除这个依赖就能彻底避免版本冲突问题。
内容的提问来源于stack exchange,提问作者Merzouk MENHOUR

