2016-04-23 11 views
1

Ich versuche, eine Storm-Topologie (Version 1.0.0) mit einer Spark-Abhängigkeit (Version 1.6.1) bereitzustellen. Diese Topologie funktioniert normalerweise mit lokalem Cluster, sendet sie jedoch nicht an einen Cluster. Ich weiß, dass Spark und Storm die mit log4j verwandten Bibliotheken benötigt. Also, wenn die pom-Datei geändert wird:Bereitstellen der Storm-Topologie mit Spark-Abhängigkeit

<!-- 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> 

Dieser Fehler tritt auf:

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") 

und ohne Ausschlüsse in der Funken Abhängigkeit dieser Fehler auftritt:

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 

In beiden Fällen oberhalb der Storm-Abhängigkeit ist die folgende:

<!-- 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> 

The Storm Ordner enthalten diese Gläser:

- 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 

Vielleicht die Funken der Lage, die Gläser zu bekommen über das Problem lösen könnte, aber ich habe Hinweise nicht zu tun finden. Jemand könnte mir mit einer Idee helfen, wie man dieses Problem löst?

Danke (:

Antwort

0

log4j definiert nur eine Logging-Schnittstelle und log4j-over-slf4j und slf4j-log4j12 und konkrete Implementierungen dieser Schnittstelle Als Sturm beide Implementierungen findet, ist nicht weiß, was man (im Fall verwenden Sie nicht. ausschließen alles).

In Ihrem „ausschließen“ Fall Sie jedoch ausschließen sowohl die Schnittstelle und die konkrete Umsetzung, so dass Sie den Fehler über die fehlende Schnittstelle erhalten. Versuchen Sie, nur die Umsetzung auszuschließen, aber nicht die Schnittstelle.

+0

Ich habe versucht, nur die Implementierung auszuschließen Einträge, aber der gleiche Fehler geht weiter. '2016-04-25 08: 24: 05.216 STDIO [FEHLER] SLF4J: Sowohl log4j-über-slf4j.jar als auch slf4j-log4j12.jar wurden auf dem Klassenpfad gefunden, wobei StackOverflowError vorweggenommen wurde. 2016-04-25 08: 24: 05.218 STDIO [FEHLER] SLF4J: Siehe auch http://www.slf4j.org/codes.html#log4jDelegationLoop für weitere Details. 2016-04-25 08: 24: 05.221 o.a.s.util [FEHLER] Async-Schleife gestorben! java.lang.ExceptionInInitializerError \t bei org.apache.log4j.Logger.getLogger (Logger.java:39) ~ [log4j-über-slf4j-1.6.6.jar: 1.6.6] '. Ich glaube, dass die libs aus storm folder verwendet werden sollten. –

+0

Vielleicht ist der Pom korrekt, weil ich die Topologie an einen Remote-Sturmcluster weitergebe, als Folge wird die libs aus dem Storm-Ordner verwendet. Aus irgendeinem Grund verwendet der Spark (lokaler Modus) diese Bibliotheken jedoch nicht. Ich habe auch versucht, einen Funkencluster zu verwenden. –