2016-05-18 11 views
7

Quando si cerca di salvare i dati a Cassandra (in Scala), ottengo la seguente eccezione:saveToCassandra con connettore scintilla cassandra getta java.lang.ClassCastException

java.lang.ClassCastException: com.datastax. driver.core.DefaultResultSetFuture non può essere lanciato a com.google.common.util.concurrent.ListenableFuture

si prega di notare che io non ottengo questo errore ogni volta, ma si tratta in modo casuale una volta ogni tanto che fa è più pericoloso nella produzione.

Sto usando YARN e ho ombreggiato com.google. ** per evitare lo scontro di simboli Guava.

Ecco il frammento di codice:

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

Qualsiasi aiuto sarebbe molto apprezzato.

UPDATE l'aggiunta di dettagli dal file pom come richiesto: versione

<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: la versione 1.5.2 Cassandra: 2.2.3

+0

È possibile condividere la versione Cassandra, la versione del connettore e la versione della scintilla in uso, nonché il modo in cui è stata ombreggiata la libreria? –

+0

@Christophe, ho aggiornato la domanda per riflettere i numeri di versione del componente. –

+0

Ho lo stesso problema. Si verifica in un test unitario. Quando si esegue il test all'interno di IntelliJ, funziona, ma 'sbt myProject/test' non riesce. – rabejens

risposta

2

Quasi tutti coloro che lavorano su C * e Spark ha visto questo tipo di errori. La causa principale è spiegata here.

Il driver C * dipende da una versione relativamente nuova di guava mentre Spark dipende da un guava precedente. Per risolvere questo problema prima del connettore 1.6.2, è necessario incorporare esplicitamente il driver C * e il guava con la propria applicazione.

A partire da 1.6.2 e 2.0.0-M3, il connettore predefinito viene fornito con il driver C * corretto e l'ombreggiatura guava. Quindi dovresti essere OK con solo artefatto del connettore incluso nel tuo progetto.

Le cose si complicano se l'applicazione Spark utilizza altre librerie che dipendono dal driver C *. Quindi dovrai includere manualmente la versione del connettore non ombreggiata, il driver C * corretto e il guava ombreggiato e distribuire un contenitore di grassi. In pratica crei il tuo pacchetto di connettori. In questo caso, non è possibile utilizzare --package per avviare il cluster Spark.

tl; dr

connettore uso 1.6.2/2.0.0-M3 o superiore. 99% dovresti essere OK.

Problemi correlati