![](/img/trans.png)
[英]java.lang.NoSuchMethodError when deploying my program using spark-submit
[英]Apache Spark — using spark-submit throws a NoSuchMethodError
要將 Spark 應用程序提交到集群,其文檔說明:
為此,請創建一個包含代碼及其依賴項的程序集 jar(或“uber”jar)。 sbt 和 Maven 都有程序集插件。 創建匯編 jar 時,將 Spark 和 Hadoop 列為提供的依賴項; 這些不需要捆綁,因為它們是由集群管理器在運行時提供的。 -- http://spark.apache.org/docs/latest/submitting-applications.html
因此,我將 Apache Maven Shade Plugin 添加到我的pom.xml
文件中。 (版本 3.0.0)
我把我的 Spark 依賴的范圍變成了provided
。 (版本 2.1.0)
(我還添加了 Apache Maven 程序集插件,以確保在運行mvn clean package
時將所有依賴項包裝在 jar 中。我不確定它是否真的有必要。)
這就是spark-submit
失敗的原因。 它為我擁有的依賴項拋出NoSuchMethodError
(請注意,代碼在 IntelliJ 內部編譯時從本地實例工作,假設provided
已刪除)。
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.createStarted()Lcom/google/common/base/Stopwatch;
拋出錯誤的代碼行無關緊要——它只是我的主要方法中的第一行,它創建了一個Stopwatch
,它是 Google Guava 實用程序的一部分。 (版本 21.0)
其他在線解決方案表明它與 Guava 的版本沖突有關,但我對這些建議還沒有任何運氣。 任何幫助將不勝感激,謝謝。
如果您查看 Spark 2.1.0 安裝的/jars
子目錄,您可能會看到guava-14.0.1.jar
。 根據您使用的 Guava Stopwatch#createStarted
方法的API,在Guava 15.0 之前不存在createStarted
。 最有可能發生的情況是,Spark 進程類加載器在找到打包在您的 uberjar 中的 Guava 21.0 庫之前先找到了 Spark 提供的 Guava 14.0.1 庫。
一種可能的解決方案是使用Maven Shade 插件提供的類重定位功能(您已經使用它來構建您的 uberjar)。 通過“類重定位”,Maven-Shade 在 uberjar 的打包過程中將 Guava 21.0 類(您的代碼需要)從反映其現有包名稱的pattern
位置(例如com.google.common.base
)移動到任意的shadedPattern
位置,您在 Shade 配置中指定(例如myguava123.com.google.common.base
)。
結果是舊的和新的 Guava 庫不再共享一個包名,避免了運行時沖突。
很可能你有依賴沖突,是的。
首先,您可以查看構建 jar 時是否存在依賴項沖突。 一種快速的方法是直接查看您的 jar 以查看 Stopwatch.class 文件是否存在,以及通過查看字節碼,是否存在 createStarted 方法。 否則,您還可以列出依賴樹並從那里開始工作: https : //maven.apache.org/plugins/maven-dependency-plugin/examples/resolving-conflicts-using-the-dependency-tree.html
如果這不是 jar 的問題,則可能是由於 Spark 安裝和 jar 之間的沖突導致的依賴性問題。 查看 Spark 安裝的 lib 和 jars 文件夾。 在那里,您可以查看是否有包含不支持來自 Stopwatch 的 createStarted() 方法的番石榴替代版本的 jar
應用以上答案通過以下配置解決問題:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<relocation>
<pattern>com.google.common</pattern>
<shadedPattern>shade.com.google.common</shadedPattern>
</relocation>
<relocation>
<pattern>com.google.thirdparty.publicsuffix</pattern>
<shadedPattern>shade.com.google.thirdparty.publicsuffix</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.