2016-04-23 4 views
1

スパーク依存性(バージョン1.6.1)のストームトポロジ(バージョン1.0.0)を導入しようとしています。そのトポロジはローカルクラスタを使用して正常に動作しますが、クラスタに送信しません。私はSparkとStormがlog4jに関連するライブラリを必要としていることを知っています。 POMファイルがに変更されたのであれば、:スパーク依存性を伴うストームトポロジの導入

<!-- Apache Spark --> 
    <dependency> 
     <groupId>org.apache.spark</groupId> 
     <artifactId>spark-core_2.10</artifactId> 
     <version>${spark.version}</version> 
     <exclusions> 
      <exclusion> 
       <groupId>org.slf4j</groupId> 
       <artifactId>slf4j-log4j12</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>log4j</groupId> 
       <artifactId>log4j</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

このエラーが発生します。

java.lang.NoSuchMethodError: org.apache.log4j.Logger.setLevel(Lorg/apache/log4j/Level;)V 
at org.apache.spark.util.AkkaUtils$$anonfun$org$apache$spark$util$AkkaUtils$$doCreateActorSystem$1.apply(AkkaUtils.scala:75) ~[stormjar.jar:?] 
at org.apache.spark.util.AkkaUtils$$anonfun$org$apache$spark$util$AkkaUtils$$doCreateActorSystem$1.apply(AkkaUtils.scala:75) ~[stormjar.jar:?] 
at scala.Option.map(Option.scala:145) ~[stormjar.jar:?] 
at org.apache.spark.util.AkkaUtils$.org$apache$spark$util$AkkaUtils$$doCreateActorSystem(AkkaUtils.scala:75) ~[stormjar.jar:?] 
at org.apache.spark.util.AkkaUtils$$anonfun$1.apply(AkkaUtils.scala:53) ~[stormjar.jar:?] 
at org.apache.spark.util.AkkaUtils$$anonfun$1.apply(AkkaUtils.scala:52) ~[stormjar.jar:?] 
at org.apache.spark.util.Utils$$anonfun$startServiceOnPort$1.apply$mcVI$sp(Utils.scala:1988) ~[stormjar.jar:?] 
at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:141) ~[stormjar.jar:?] 
at org.apache.spark.util.Utils$.startServiceOnPort(Utils.scala:1979) ~[stormjar.jar:?] 
at org.apache.spark.util.AkkaUtils$.createActorSystem(AkkaUtils.scala:55) ~[stormjar.jar:?] 
at org.apache.spark.SparkEnv$.create(SparkEnv.scala:266) ~[stormjar.jar:?] 
at org.apache.spark.SparkEnv$.createDriverEnv(SparkEnv.scala:193) ~[stormjar.jar:?] 
at org.apache.spark.SparkContext.createSparkEnv(SparkContext.scala:288) ~[stormjar.jar:?] 
at org.apache.spark.SparkContext.<init>(SparkContext.scala:457) ~[stormjar.jar:?] 
at org.apache.spark.api.java.JavaSparkContext.<init>(JavaSparkContext.scala:59) ~[stormjar.jar:?] 
at ufrn.imd.engsoft.storm.SentimentAnalyserBolt.prepare(SentimentAnalyserBolt.java:106) ~[stormjar.jar:?] 
at org.apache.storm.daemon.executor$fn__8226$fn__8239.invoke(executor.clj:795) ~[storm-core-1.0.0.jar:1.0.0] 
at org.apache.storm.util$async_loop$fn__554.invoke(util.clj:482) [storm-core-1.0.0.jar:1.0.0] 
at clojure.lang.AFn.run(AFn.java:22) [clojure-1.7.0.jar:?] 
at java.lang.Thread.run(Thread.java:745) [?:1.8.0_65] 
2016-04-22 00:29:06.285 o.a.s.util [ERROR] Halting process: ("Worker died") 

そして、このエラーが発生するスパークの依存関係で任意の除外せずに:

java.lang.ExceptionInInitializerError 
at org.apache.log4j.Logger.getLogger(Logger.java:39) ~[log4j-over-slf4j-1.6.6.jar:1.6.6] 
at org.apache.spark.util.AkkaUtils$.org$apache$spark$util$AkkaUtils$$doCreateActorSystem(AkkaUtils.scala:75) ~[spark-assembly-1.6.1-hadoop2.6.0.jar:1.6.1] 
at org.apache.spark.util.AkkaUtils$$anonfun$1.apply(AkkaUtils.scala:53) ~[spark-assembly-1.6.1-hadoop2.6.0.jar:1.6.1] 
at org.apache.spark.util.AkkaUtils$$anonfun$1.apply(AkkaUtils.scala:52) ~[spark-assembly-1.6.1-hadoop2.6.0.jar:1.6.1] 
at org.apache.spark.util.Utils$$anonfun$startServiceOnPort$1.apply$mcVI$sp(Utils.scala:1988) ~[spark-assembly-1.6.1-hadoop2.6.0.jar:1.6.1] 
at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:141) ~[spark-assembly-1.6.1-hadoop2.6.0.jar:1.6.1] 
at org.apache.spark.util.Utils$.startServiceOnPort(Utils.scala:1979) ~[spark-assembly-1.6.1-hadoop2.6.0.jar:1.6.1] 
at org.apache.spark.util.AkkaUtils$.createActorSystem(AkkaUtils.scala:55) ~[spark-assembly-1.6.1-hadoop2.6.0.jar:1.6.1] 
at org.apache.spark.SparkEnv$.create(SparkEnv.scala:266) ~[spark-assembly-1.6.1-hadoop2.6.0.jar:1.6.1] 
at org.apache.spark.SparkEnv$.createDriverEnv(SparkEnv.scala:193) ~[spark-assembly-1.6.1-hadoop2.6.0.jar:1.6.1] 
at org.apache.spark.SparkContext.createSparkEnv(SparkContext.scala:288) ~[spark-assembly-1.6.1-hadoop2.6.0.jar:1.6.1] 
at org.apache.spark.SparkContext.<init>(SparkContext.scala:457) ~[spark-assembly-1.6.1-hadoop2.6.0.jar:1.6.1] 
at org.apache.spark.api.java.JavaSparkContext.<init>(JavaSparkContext.scala:59) ~[spark-assembly-1.6.1-hadoop2.6.0.jar:1.6.1] 
at ufrn.imd.engsoft.storm.SentimentAnalyserBolt.prepare(SentimentAnalyserBolt.java:106) ~[stormjar.jar:?] 
at org.apache.storm.daemon.executor$fn__8226$fn__8239.invoke(executor.clj:795) ~[storm-core-1.0.0.jar:1.0.0] 
at org.apache.storm.util$async_loop$fn__554.invoke(util.clj:482) [storm-core-1.0.0.jar:1.0.0] 
at clojure.lang.AFn.run(AFn.java:22) [clojure-1.7.0.jar:?] 
at java.lang.Thread.run(Thread.java:745) [?:1.8.0_65] 
Caused by: java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError. See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details. 
at org.apache.log4j.Log4jLoggerFactory.<clinit>(Log4jLoggerFactory.java:49) ~[log4j-over-slf4j-1.6.6.jar:1.6.6] 
... 18 more 

どちらの場合も、ストームの依存性の上には、次のものがあります。

<!-- Apache Storm --> 
    <dependency> 
     <groupId>org.apache.storm</groupId> 
     <artifactId>storm-core</artifactId> 
     <version>${storm.version}</version> 
     <scope>provided</scope> 
     <exclusions> 
      <exclusion> 
       <groupId>org.slf4j</groupId> 
       <artifactId>slf4j-log4j12</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>log4j</groupId> 
       <artifactId>log4j</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

ストームフォルダには、これらのjarファイルが含まれています:

- log4-api-2.1 
- log4j-core-2.1 
- log4j-over-sl4j-1.6.6 
- log4j-sl4j-impl-2.1 
- sl4j-api-1.7.7 
- sl4j-log4j12 

たぶん、上記のjarファイルを取得することができるというスパークは、その問題を解決することができますが、私はそれを行うための手がかりを見つけることができませんでした。誰かがその問題を解決する方法について私に助けてくれるでしょうか?

おかげで(:!。

答えて

0

log4jは嵐の両方の実装を見つけたように、このインタフェースのログ記録インターフェースとlog4j-over-slf4jslf4j-log4j12と、具体的な実装を定義する場合には(あなたがいない使用するかを知っていないです)何も除外しています。あなたの「除外」の場合には

しかし、あなたは、インターフェイスおよび具体的な実装の両方を除外するので、あなたが不足しているインターフェイスに関するエラーを取得します。インプリメンテーションではなく、インタフェースだけを除外するようにしてください。

+0

私は除外しようとしたのはimplemだけしかし、同じエラーが続く。 '2016-04-25 08:24:05.216 STDIO [ERROR] SLF4J:クラスパス上のlog4j-over-slf4j.jarとslf4j-log4j12.jarの両方を検出し、StackOverflowErrorを先取りします。 2016-04-25 08:24:05.218 STDIO [エラー] SLF4J:詳細はhttp://www.slf4j.org/codes.html#log4jDelegationLoopも参照してください。 2016-04-25 08:24:05.221 o.a.s.util [ERROR]非同期ループが終了しました! java.lang.ExceptionInInitializerError \t at org.apache.log4j.Logger.getLogger(Logger.java:39)〜[log4j-over-slf4j-1.6.6.jar:1.6.6] '。私は嵐のフォルダからlibsを使用する必要がありますと信じています。 –

+0

私はリモートストームクラスタにトポロジを送信しているので、pomが正しいかもしれません。結果として、stormフォルダのlibsが使用されています。しかし、何らかの理由でSpark(ローカルモード)がlibsを利用していません。私もスパーククラスターを使用しようとしました。 –