簡體   English   中英

Apache Spark — 使用 spark-submit 會拋出 NoSuchMethodError

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM