Apache Spark——使用spark-submit抛出NoSuchMethodError

2024-01-11

要将 Spark 应用程序提交到集群,他们的文档指出:

为此,请创建一个包含代码及其依赖项的程序集 jar(或“uber”jar)。 sbt 和 Maven 都有汇编插件。创建程序集 jar 时,将 Spark 和 Hadoop 列为提供的依赖项;这些不需要捆绑,因为它们是由集群管理器在运行时提供的。 --http://spark.apache.org/docs/latest/submitting-applications.html http://spark.apache.org/docs/latest/submitting-applications.html

因此,我将 Apache Maven Shade 插件添加到我的pom.xml文件。 (3.0.0版本)
我将 Spark 依赖项的范围变成provided。 (2.1.0版本)

(我还添加了 Apache Maven 程序集插件,以确保在运行时将所有依赖项包装在 jar 中mvn clean package。我不确定这是否真的有必要。)


就是这样spark-submit失败。它抛出一个NoSuchMethodError对于我有的依赖项(请注意,在 IntelliJ 内部编译时,代码在本地实例中工作,假设provided已移除)。

Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.createStarted()Lcom/google/common/base/Stopwatch;

引发错误的代码行是无关紧要的——它只是我的 main 方法中创建一个Stopwatch,Google Guava 实用程序的一部分。 (21.0版本)

网上的其他解决方案表明这与 Guava 的版本冲突有关,但我对这些建议还没有任何运气。任何帮助将不胜感激,谢谢。


如果你看一下/jarsSpark 2.1.0 安装的子目录,您可能会看到guava-14.0.1.jar。根据番石榴 APIStopwatch#createStarted method https://google.github.io/guava/releases/21.0/api/docs/com/google/common/base/Stopwatch.html#createStarted--您正在使用,createStarted直到 Guava 15.0 才存在。最有可能发生的情况是,Spark 进程类加载器先找到 Spark 提供的 Guava 14.0.1 库,然后再找到打包在 uberjar 中的 Guava 21.0 库。

一种可能的解决方案是使用Maven Shade 插件提供的类重定位功能 http://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html(您已经在使用它来构建您的 uberjar)。通过“类重定位”,Maven-Shade 在打包 uberjar 期间移动 Guava 21.0 类(您的代码需要)。pattern反映其现有包名称的位置(例如com.google.common.base)到任意shadedPattern位置,您在 Shade 配置中指定(例如myguava123.com.google.common.base).

结果是旧的和新的 Guava 库不再共享包名称,避免了运行时冲突。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apache Spark——使用spark-submit抛出NoSuchMethodError 的相关文章

随机推荐