2016-04-26 20 views
4

Ich bin Funke-Job auf emr ausgeführt und mit DataStax-Connector zu Cassandra-Cluster verbinden. Ich bin vor Probleme mit der Guave jar bitte die Details finden wie unten ich unten cassandra bin mit depsErkannte Guava-Problem # 1635, die angibt, dass eine Version von Guava weniger als 16,01 verwendet wird

cqlsh 5.0.1 | Cassandra 3.0.1 | CQL spec 3.3.1 

Lauffunken Job auf EMR 4.4 mit unter Maven deps

org.apache.spark Funke -streaming_2.10 1.5.0

<dependency> 
    <groupId>org.apache.spark</groupId> 
    <artifactId>spark-core_2.10</artifactId> 
    <version>1.5.0</version> 
</dependency> 

<dependency> 
    <groupId>org.apache.spark</groupId><dependency> 
    <groupId>com.datastax.spark</groupId> 
    <artifactId>spark-cassandra-connector_2.10</artifactId> 
    <version>1.5.0</version> 
</dependency> 

    <artifactId>spark-streaming-kinesis-asl_2.10</artifactId> 
    <version>1.5.0</version> 
</dependency> 

Fragen, mit denen, wenn ich einreichen Funken Job als unter

ava.lang.ExceptionInInitializerError 
     at com.datastax.spark.connector.cql.DefaultConnectionFactory$.clusterBuilder(CassandraConnectionFactory.scala:35) 
     at com.datastax.spark.connector.cql.DefaultConnectionFactory$.createCluster(CassandraConnectionFactory.scala:87) 
     at com.datastax.spark.connector.cql.CassandraConnector$.com$datastax$spark$connector$cql$CassandraConnector$$createSession(CassandraConnector.scala:153) 
     at com.datastax.spark.connector.cql.CassandraConnector$$anonfun$2.apply(CassandraConnector.scala:148) 
     at com.datastax.spark.connector.cql.CassandraConnector$$anonfun$2.apply(CassandraConnector.scala:148) 
     at com.datastax.spark.connector.cql.RefCountedCache.createNewValueAndKeys(RefCountedCache.scala:31) 
     at com.datastax.spark.connector.cql.RefCountedCache.acquire(RefCountedCache.scala:56) 
     at com.datastax.spark.connector.cql.CassandraConnector.openSession(CassandraConnector.scala:81) 
     at ampush.event.process.core.CassandraServiceManagerImpl.getAdMetaInfo(CassandraServiceManagerImpl.java:158) 
     at ampush.event.config.metric.processor.ScheduledEventAggregator$4.call(ScheduledEventAggregator.java:308) 
     at ampush.event.config.metric.processor.ScheduledEventAggregator$4.call(ScheduledEventAggregator.java:290) 
     at org.apache.spark.api.java.JavaRDDLike$$anonfun$foreachPartition$1.apply(JavaRDDLike.scala:222) 
     at org.apache.spark.api.java.JavaRDDLike$$anonfun$foreachPartition$1.apply(JavaRDDLike.scala:222) 
     at org.apache.spark.rdd.RDD$$anonfun$foreachPartition$1$$anonfun$apply$29.apply(RDD.scala:902) 
     at org.apache.spark.rdd.RDD$$anonfun$foreachPartition$1$$anonfun$apply$29.apply(RDD.scala:902) 
     at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1850) 
     at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1850) 
     at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66) 
     at org.apache.spark.scheduler.Task.run(Task.scala:88) 
     at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
     at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.IllegalStateException: Detected Guava issue #1635 which indicates that a version of Guava less than 16.01 is in use. This introduces codec resolution issues and potentially other incompatibility issues in the driver. Please upgrade to Guava 16.01 or later. 
     at com.datastax.driver.core.SanityChecks.checkGuava(SanityChecks.java:62) 
     at com.datastax.driver.core.SanityChecks.check(SanityChecks.java:36) 
     at com.datastax.driver.core.Cluster.<clinit>(Cluster.java:67) 
     ... 23 more 

lassen Sie mich bitte wissen, wie man hier Guava Deps verwaltet?

Dank

+0

Ihre Abhängigkeitsblöcke sind unvollständig –

Antwort

1

Fügen Sie einfach in Ihrem <dependencies> Block etwas POM wie folgt aus:

<dependency> 
    <groupId>com.google.guava</groupId> 
    <artifactId>guava</artifactId> 
    <version>19.0</version> 
</dependency> 

(oder eine beliebige Version> 16.0.1, die Sie bevorzugen)

+0

Ich ging durch den Link https://groups.google.com/a/lists.datastax.com/forum/#!topic/spark-connector-user/HnTsWJkI5jo, der Spark 1.5 sagt verwendet Guava 14, erfordert Cassandra Treiberkern Guava 16. Der Funken cassandra connetor steigt eine Ausnahme. also, wie das Hinzufügen von oben mein Problem lösen könnte, könnte eine neue Frage sein. danke –

+0

Auch wie pro Link https://github.com/datastax/spark-cassandra-connector verwende ich 1.5 cassandra Verbindungsstück \t 1.5, 1.6 (Spak) \t 3.0 (cassandra)? nicht sicher dann, warum ich Frage –

+0

bekomme Nicht sicher, was Sie gefragt haben. Wenn Sie wissen möchten, warum Maven die alte Version von Guava auflöste, können Sie 'mvn dependency: tree' verwenden, die Ihnen zeigt, wie jede Abhängigkeit transitiv gelöst (oder ignoriert) wird –

2

ich das gleiche Problem habe und löste es mit dem maven Shade-Plugin, um die Guava-Version zu schattieren, die der Cassandra-Connector mitbringt.

Ich musste den optionalen, Präsentieren und Nichtvorhandensein von Klassen explizit, weil ich Probleme mit Spark hatte, die versuchen, vom nicht schattierten Guava Present-Typ in den schattierten optionalen Typ zu konvertieren. Ich bin mir nicht sicher, ob das später irgendwelche Probleme verursachen wird, aber es scheint für mich im Moment zu funktionieren.

Sie können diese an die in Ihrem pom.xml <plugins> Abschnitt hinzufügen:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>2.4.3</version> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal> 
        shade 
       </goal> 
      </goals> 
     </execution> 
    </executions> 

    <configuration> 
     <minimizeJar>true</minimizeJar> 
     <shadedArtifactAttached>true</shadedArtifactAttached> 
     <shadedClassifierName>fat</shadedClassifierName> 

     <relocations> 
      <relocation> 
       <pattern>com.google</pattern> 
       <shadedPattern>shaded.guava</shadedPattern> 
       <includes> 
        <include>com.google.**</include> 
       </includes> 

       <excludes> 
        <exclude>com.google.common.base.Optional</exclude> 
        <exclude>com.google.common.base.Absent</exclude> 
        <exclude>com.google.common.base.Present</exclude> 
       </excludes> 
      </relocation> 
     </relocations> 

     <filters> 
      <filter> 
       <artifact>*:*</artifact> 
       <excludes> 
        <exclude>META-INF/*.SF</exclude> 
        <exclude>META-INF/*.DSA</exclude> 
        <exclude>META-INF/*.RSA</exclude> 
       </excludes> 
      </filter> 
     </filters> 

    </configuration> 
</plugin> 
+1

Dies wird den Zweck hier nicht lösen. Der Grund hierfür ist unsere Bereitstellungsplattform EMR. Die Art und Weise, wie emr den Standard-Klassenpfad von spark baut, verwendet weniger <16-Version von Guava im Klassenpfad, was darauf zurückzuführen ist, dass er mit EMR 4.2 \ 4.4 \ 4.6 noch alte Hadoop-Bibliotheken abruft. Ich habe meinen behoben, indem ich den Bootstrap-Prozess zu emr hinzugefügt habe, um den Standard-Spark-Klassenpfad mit einem aktualisierten zu überschreiben. –

+0

Ich bestätige, dass dies das Problem für mich auf einem Spark Standalone v1.5.2 Cluster und Spark Cassandra Connector v1.5.1 behebt. Vielen Dank. –

5

Eine andere Lösung, in das Verzeichnis gehen

Funken/Dosen

. Benennen Sie guava-14.0.1.jar dann guava-19.0.jar, wie dieses Bild kopieren:

enter image description here

+2

Als Hinweis, Guava 20 wird dafür nicht funktionieren. Guava 19 funktioniert jedoch. –

+0

So ein toller Hack! –

0

ich war in der Lage, dies zu umgehen, indem die Guave 16.0.1 jar externe Zugabe und dann unter Angabe der Klassenpfad auf Funken mit Hilfe von unter Konfigurationswerte einreichen :

--conf "spark.driver.extraClassPath =/Guave-16.0.1.jar" --conf "spark.executor.extraClassPath =/Guave-16.0.1.jar"

Hoffe das hilft jemandem mit s ähnlicher Fehler!

0

Danke Adrian für Ihre Antwort.

Ich bin ein wenig von einer anderen Architektur als alle anderen auf dem Thread, aber das Guava-Problem ist immer noch das gleiche.Ich benutze Funke 2.2 mit Mesosphäre. In unserer Entwicklungsumgebung verwenden wir sbt-native-packager, um unsere Docker-Images für die Übertragung in Mesos zu erstellen.

Es stellte sich heraus, dass wir eine andere Guave für die Spark-Submit-Executoren benötigen mussten als für den Code, den wir auf dem Treiber ausführen. Das hat für mich funktioniert.

build.sbt

.... 
libraryDependencies ++= Seq(
    "com.google.guava" % "guava" % "19.0" force(), 
    "org.apache.hadoop" % "hadoop-aws" % "2.7.3" excludeAll (
    ExclusionRule(organization = "org.apache.hadoop", name = "hadoop-common"), //this is for s3a 
    ExclusionRule(organization = "com.google.guava", name= "guava")), 
    "org.apache.spark" %% "spark-core" % "2.1.0" excludeAll (
    ExclusionRule("org.glassfish.jersey.bundles.repackaged", name="jersey-guava"), 
    ExclusionRule(organization = "com.google.guava", name= "guava")) , 
    "com.github.scopt" %% "scopt" % "3.7.0" excludeAll (
    ExclusionRule("org.glassfish.jersey.bundles.repackaged", name="jersey-guava"), 
    ExclusionRule(organization = "com.google.guava", name= "guava")) , 
    "com.datastax.spark" %% "spark-cassandra-connector" % "2.0.6", 
... 
dockerCommands ++= Seq(
... 
    Cmd("RUN rm /opt/spark/dist/jars/guava-14.0.1.jar"), 
    Cmd("RUN wget -q http://central.maven.org/maven2/com/google/guava/guava/23.0/guava-23.0.jar -O /opt/spark/dist/jars/guava-23.0.jar") 
... 

Als ich versuchte, Guave 14 auf dem Testamentsvollstrecker mit Guave 16.0.1 oder 19 zu ersetzen, es würde funktionieren noch nicht. Spark submit ist gerade gestorben. Mein fetter Krug, der tatsächlich die Guave ist, die für meine Anwendung im Fahrer verwendet wird, zwang ich, 19 zu sein, aber mein Funkensammlungsvollstrecker musste ich ersetzen, um 23 zu sein. Ich habe versucht, zu 16 und 19 zu ersetzen, aber Funken ist gerade gestorben da auch.

Sorry für die Umleitung, aber jedes Mal nach all meinen Google-Suchen kam dieses jedes Mal auf. Ich hoffe, das hilft auch anderen SBT/mesos Leuten.