You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Spark项目Guava库NoSuchMethodError错误求助

解决Spark项目中Guava版本冲突导致的NoSuchMethodError问题

这是典型的Guava版本冲突问题——Spark对Guava有特定的版本依赖,而你的项目大概率通过依赖传递引入了不兼容的Guava版本,或者某个第三方依赖覆盖了Spark所需的版本,最终引发java.lang.NoSuchMethodError: com.google.common.cache.CacheBuilder.refreshAfterWrite这类方法找不到的错误(注:refreshAfterWrite是Guava 16.0及以后才新增的API)。

下面是一步步的排查和解决步骤:

1. 先定位冲突的Guava版本

首先用Maven命令生成依赖树,精准找到所有引入Guava的路径:

mvn dependency:tree -Dincludes=com.google.guava:guava

执行后你会看到类似这样的输出,能清晰看到哪个依赖带了和Spark要求不一致的Guava版本:

[INFO] +- org.apache.spark:spark-core_2.12:jar:3.3.0:compile
[INFO] | - com.google.guava:guava:jar:27.0-jre:compile
[INFO] +- xxx:xxx:jar:1.0.0:compile
[INFO] | - com.google.guava:guava:jar:15.0:compile

上面的例子里,就是某个第三方依赖引入了Guava 15.0,和Spark 3.3.0需要的27.0-jre冲突了。

2. 强制统一Guava版本(推荐方案)

在你的pom.xml中添加<dependencyManagement>节点,强制指定Spark兼容的Guava版本,这样所有依赖都会使用这个统一版本:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <!-- 替换成你当前Spark版本对应的兼容版本:
                 Spark 2.x通常用14.0.1/16.0.1;Spark 3.x一般用27.0-jre/30.1-jre
                 可以查看Spark官方文档或spark-core的依赖确认准确版本 -->
            <version>27.0-jre</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

3. 排除特定依赖中的冲突Guava

如果某个第三方依赖必须使用特定版本,但它带的Guava和Spark冲突,你可以直接在该依赖中排除Guava:

<dependency>
    <!-- 这里是冲突的第三方依赖 -->
    <groupId>xxx</groupId>
    <artifactId>xxx</artifactId>
    <version>xxx</version>
    <exclusions>
        <exclusion>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
        </exclusion>
    </exclusions>
</dependency>

4. 验证解决效果

重新执行mvn dependency:tree -Dincludes=com.google.guava:guava,确认所有Guava依赖都统一为你指定的版本,然后重启Spark项目,这个方法找不到的错误应该就会消失了。

内容的提问来源于stack exchange,提问作者WestCoastProjects

火山引擎 最新活动