2017-11-30 31 views
0

これにはいくつか前の質問がありますが、回答では問題解決のための十分な情報が得られないことがよくあります。Nettyバージョンと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-パック交通クライアントがスパークから来るネッティーを使用していたので、私はそれを除外することを信じていました。それを除外しても、同じ問題が発生します。ここでは、依存関係の私達のセットです:

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がスパークからネッティーを除くと火花Excelをされていない、と私はなぜ...私たちは、SBT 1.0.4を使用しているかわかりません。

更新:spark-submit/Sparkが犯人で、以下の回答があります。

+0

バージョンがあるExclusionRule( "io.netty"% "netty-all"% "4.1.6.Final")。または何でも試してみることができますか?これはivyによって解決され、特定のバージョンが必要なので、基本的に正確なバージョンのnettyを指定します。 –

+0

'ExclusionRule()'はバージョンを受け付けていないようです... – skylerl

+0

変更されたexcludeAllは無用に除外されます – skylerl

答えて

1

さて、多くの試練と苦難の後、私はそれを理解しました。問題は、SBTが図書館を除外しなかったことではなく、完全に除外していたことである。問題は、4.1.11.FinalではないNettyのバージョンを除外していたにもかかわらず、SparkはSBTの外にある独自のjarファイルと私の構築したjarファイルを使用していたということでした。

​​を実行すると、$SPARK_HOME/libディレクトリのjarが含まれます。

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

その結果、スパークは、独自のネッティー含めた、だから、/usr/local/Cellar/apache-spark/2.2.0/libexec/jars/netty-all-4.0.43.Final.jar

のjarファイルの場所である:それらの一つは、この問題は、この呼び出しで示されているネッティー4の古いバージョンです依存。私がSBTで私の瓶を作ったとき、それは正しい瓶を持っていた。 Sparkにはと書かれているin the Spark config documentationという設定がありますが、これをtrueに設定すると、Nettyの新しいバージョンを使用する際に問題が発生します。

私は、トランスポートクライアントを使用して切り捨て、信頼できる古いHTTPリクエストを使用することにしました。

関連する問題