簡體   English   中英

Netty版本與Spark + Elasticsearch Transport沖突

[英]Netty Version Conflict with Spark + Elasticsearch Transport

這有幾個先前的問題,有答案,但是答案通常沒有足夠的信息來解決問題。

我正在使用Apache Spark將數據提取到Elasticsearch中。 我們正在使用X-Pack安全性及其相應的傳輸客戶端。 我在特殊情況下使用傳輸客戶端創建/刪除索引,然后使用Spark進行提取。 當我們的代碼到達client.close() ,將引發異常:

Exception in thread "elasticsearch[_client_][generic][T#2]" java.lang.NoSuchMethodError: io.netty.bootstrap.Bootstrap.config()Lio/netty/bootstrap/BootstrapConfig;
        at org.elasticsearch.transport.netty4.Netty4Transport.lambda$stopInternal$5(Netty4Transport.java:443)
        at org.apache.lucene.util.IOUtils.close(IOUtils.java:89)
        at org.elasticsearch.common.lease.Releasables.close(Releasables.java:36)
        at org.elasticsearch.common.lease.Releasables.close(Releasables.java:46)
        at org.elasticsearch.common.lease.Releasables.close(Releasables.java:51)
        at org.elasticsearch.transport.netty4.Netty4Transport.stopInternal(Netty4Transport.java:426)
        at org.elasticsearch.transport.TcpTransport.lambda$doStop$5(TcpTransport.java:959)
        at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingRunnable.run(ThreadContext.java:569)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

最初,我認為X-Pack Transport客戶端使用的是來自Spark的Netty,因此我將其排除在外。 即使排除了它,我們也遇到了同樣的問題。 這是我們的依賴項集:

    libraryDependencies ++= Seq(
   "com.crealytics" % "spark-excel_2.11" % "0.9.1" exclude("io.netty", "netty-all"),
  "com.github.alexarchambault" %% "scalacheck-shapeless_1.13" % "1.1.6" % Test,
  "com.holdenkarau" % "spark-testing-base_2.11" % "2.2.0_0.7.4" % Test exclude("org.scalatest", "scalatest_2.11") ,
  "com.opentable.components" % "otj-pg-embedded" % "0.9.0" % Test,
  "org.apache.spark" % "spark-core_2.11" % "2.2.0" % "provided" exclude("org.scalatest", "scalatest_2.11") exclude("io.netty", "netty-all"),
  "org.apache.spark" % "spark-sql_2.11" % "2.2.0" % "provided" exclude("org.scalatest", "scalatest_2.11") exclude("io.netty", "netty-all"),
  "org.apache.spark" % "spark-hive_2.11" % "2.2.0" % "provided" exclude("org.scalatest", "scalatest_2.11") exclude("io.netty", "netty-all"),
  "org.apache.logging.log4j" % "log4j-core" %"2.8.2",
  "org.elasticsearch" % "elasticsearch-spark-20_2.11" % "5.5.0" exclude("org.scalatest", "scalatest_2.11") exclude("io.netty", "netty-all"),
  "org.elasticsearch.client" % "x-pack-transport" % "5.5.0",
  "org.elasticsearch.client" % "transport" % "5.5.0",
  "org.elasticsearch.test" % "framework" % "5.4.3" % Test,
  "org.postgresql" % "postgresql" % "42.1.4",
  "org.scalamock" %% "scalamock-scalatest-support" % "3.5.0" % Test,
  "org.scalatest" % "scalatest_2.11" % "3.0.1" % Test,
  "org.scalacheck" %% "scalacheck" % "1.13.4" % Test,
  "org.scalactic" %% "scalactic" % "3.0.1",
  "org.scalatest" %% "scalatest" % "3.0.1" % Test,
  "mysql" % "mysql-connector-java" % "5.1.44"
      )

我用sbt dependencyTree驗證了SBT沒有從Spark和spark-excel中排除凈sbt dependencyTree ,而且我不確定為什么...我們正在使用SBT 1.0.4。

更新:提交火花/火花是元凶,請在下面回答!

好吧,經過多次考驗和磨難,我弄清楚了。 問題不是SBT沒有排除庫,而是完全排除了它們。 問題是,即使我排除了不是4.1.11.Final版本的Netty版本,Spark 4.1.11.Final SBT和我的內置jar之外使用自己的jar。

運行spark-submit ,它包含$SPARK_HOME/lib目錄中的jar。 其中之一是Netty 4的較舊版本。此調用顯示此問題:

bootstrap.getClass().getProtectionDomain().getCodeSource()

其結果是/usr/local/Cellar/apache-spark/2.2.0/libexec/jars/netty-all-4.0.43.Final.jar的jar位置

因此,Spark包含了自己的Netty依賴項。 當我用SBT創建jar時,它具有正確的jar。 Spark對此配置有一個名為spark.driver.userClassPathFirst的配置,該配置記錄在Spark配置文檔中,但是當我將其設置為true時,最終會遇到與使用更高版本的Netty有關的問題。

我決定放棄使用傳輸客戶端,而使用可信任的舊HTTP請求。

我遇到了同樣的問題,即需要一個將Netty與Spark結合使用的依賴項。 我也嘗試了spark.driver.userClassPathFirst選項,但它不起作用。 我發現了另一個我想分享的解決方法,以防將來對其他人有所幫助。

由於我們創建了一個可與spark-submit配合使用的程序集jar,所以我認為我可以將程序集jar中的依賴項着色,以便spark-submit可以引入其自己的Netty版本而不會發生沖突。 我們正在使用https://github.com/sbt/sbt-assembly插件,因此我需要做的就是將它包含在模塊中我的build.sbt中:

assemblyShadeRules in assembly := Seq(
  ShadeRule.rename("io.netty.**" -> "shadenetty.@1").inAll
)

從spark-core為我們工作的Netty依賴項中排除

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.10</artifactId>
            <version>${spark.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>io.netty</groupId>
                    <artifactId>netty-all</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>io.netty</groupId>
                    <artifactId>netty</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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