2016-05-18 8 views
7

Beim Versuch, Daten zu Cassandra (in Scala) zu speichern, erhalte ich die folgende Ausnahme:saveToCassandra mit Funken cassandra Stecker wirft java.lang.ClassCastException

java.lang.ClassCastException: com.datastax. driver.core.DefaultResultSetFuture kann nicht auf com.google.common.util.concurrent.ListenableFuture

Bitte gegossen werden anmerken, dass ich diesen Fehler nicht jedes Mal bekomme, aber es kommt in eine Weile zufällig einmal nach oben, die macht es ist in der Produktion gefährlicher.

Ich benutze YARN und ich habe com.google. ** beschattet, um den Guava-Symbolkonflikt zu vermeiden.

Hier ist der Code-Schnipsel:

rdd.saveToCassandra(keyspace,"movie_attributes", SomeColumns("movie_id","movie_title","genre")) 

Jede Hilfe sehr geschätzt werden würde.

UPDATE Hinzufügen von Details aus der pom-Datei wie gewünscht:

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

**Shading guava** 

<relocation> <!-- Conflicts between Cassandra Java driver and YARN --> 
    <pattern>com.google</pattern> 
    <shadedPattern>oryx.com.google</shadedPattern> 
    <includes> 
     <include>com.google.common.**</include> 
    </includes> 
</relocation> 

Spark-Version: 1.5.2 Cassandra Version: 2.2.3

+0

Können Sie die Cassandra-Version, die Connector-Version und die Spark-Version, die Sie verwenden, sowie die Abschattung der Bibliothek teilen? –

+0

@Christophe, ich habe die Frage aktualisiert, um die Versionsnummern der Komponenten widerzuspiegeln. –

+0

Ich habe das gleiche Problem. Es tritt in einem Komponententest auf. Wenn der Test in IntelliJ ausgeführt wird, funktioniert es, aber "sbt myProject/test" schlägt fehl. – rabejens

Antwort

2

Fast jeder, der auf C * und Funken arbeitet hat diese Art von Fehlern gesehen. Die Ursache wird erklärt here.

C * -Treiber hängt von einer relativ neuen Version der Guave ab, während Spark von einer älteren Guave abhängt. Um dies vor Connector 1.6.2 zu lösen, müssen Sie C * -Treiber und Guave explizit mit Ihrer Anwendung einbetten.

Seit 1.6.2 und 2.0.0-M3 wird der Connector standardmäßig mit dem korrekten C * -Treiber und der schattierten Guave ausgeliefert. Sie sollten also mit dem in Ihrem Projekt enthaltenen Konnektor-Artefakt einverstanden sein.

Es wird schwierig, wenn Ihre Spark-Anwendung andere Bibliotheken verwendet, die vom C * -Treiber abhängen. Dann müssen Sie die nicht schattierte Version des Connectors manuell hinzufügen, den C * -Treiber und die schattierte Guave korrigieren und ein fettes Gefäß bereitstellen. Sie machen im Wesentlichen Ihr eigenes Connector-Paket. In diesem Fall können Sie --package nicht mehr zum Starten des Spark-Clusters verwenden.

tl; dr

Verwendung Verbinder 1.6.2/2.0.0-M3 oder darüber. 99% sollten Sie in Ordnung sein.