7

L'eccezione esatto è il seguenteDatastax Cassandra driver gettando CodecNotFoundException

com.datastax.driver.core.exceptions.CodecNotFoundException: Codec non trovato per il funzionamento richiesto: [varchar < -> java.math.BigDecimal]

Queste sono le versioni del software che sto usando Spark 1.5 Datastax-cassandra 3.2.1 CDH 5.5.1

il codice che sto cercando di eseguire è un programma di Spark utilizzando l'API Java e si legge in sostanza i dati (csv's) per m hdfs e lo carica in tavolini cassandra. Sto usando il connettore della candela-cassandra. Ho avuto un sacco di problemi riguardanti il ​​conflitto della libreria guava di google che inizialmente sono stato in grado di risolvere oscurando la libreria guava e costruendo un vaso snapshot con tutte le dipendenze.

Tuttavia, sono riuscito a caricare i dati per alcuni file, ma per alcuni file ottengo l'eccezione Codec. Quando ho effettuato una ricerca su questo argomento, ho ottenuto questi thread seguenti sullo stesso problema.

https://groups.google.com/a/lists.datastax.com/forum/#!topic/java-driver-user/yZyaOQ-wazk

https://groups.google.com/a/lists.datastax.com/forum/#!topic/java-driver-user/yZyaOQ-wazk

Dopo aver attraversato questi discussione quello che ho capito è o si tratta di una versione errata del cassandra-pilota che sto usando. Oppure esiste ancora un problema di classe relativo alla libreria guava in quanto cassandra 3.0 e versioni successive usano guava 16.0.1 e le discussioni precedenti dicono che potrebbe esserci una versione inferiore del guava presente nel percorso della classe.

Ecco il file pom.xml

<dependencies> 
<dependency> 
<groupId>org.apache.spark</groupId> 
<artifactId>spark-core_2.10</artifactId> 
<version>1.5.0</version> 
</dependency> 
<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>3.8.1</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
<groupId>com.datastax.spark</groupId> 
<artifactId>spark-cassandra-connector-java_2.10</artifactId> 
<version>1.5.0-M3</version> 
</dependency> 
<dependency> 
<groupId>org.apache.cassandra</groupId> 
<artifactId>cassandra-clientutil</artifactId> 
<version>3.2.1</version> 
</dependency> 

</dependencies> 
    <build> 
<plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>2.3</version> 
     <executions> 
      <execution> 
       <phase>package</phase> 
       <goals> 
        <goal>shade</goal> 
       </goals> 
       <configuration> 
       <filters> 
    <filter> 
     <artifact>*:*</artifact> 
     <excludes> 
      <exclude>META-INF/*.SF</exclude> 
      <exclude>META-INF/*.DSA</exclude> 
      <exclude>META-INF/*.RSA</exclude> 
     </excludes> 
    </filter> 
</filters> 
        <relocations> 
         <relocation> 
          <pattern>com.google</pattern> 
          <shadedPattern>com.pointcross.shaded.google</shadedPattern> 
         </relocation> 

        </relocations> 
        <minimizeJar>false</minimizeJar> 
        <shadedArtifactAttached>true</shadedArtifactAttached> 
       </configuration> 
      </execution> 
     </executions> 
    </plugin> 
</plugins> 
</build> 
</project> 

e queste sono le dipendenze che sono stati scaricati utilizzando il pom sopra

spark-core_2.10-1.5.0.jar 
spark-cassandra-connector- java_2.10-1.5.0-M3.jar 
spark-cassandra-connector_2.10-1.5.0-M3.jar 
spark-repl_2.10-1.5.1.jar 
spark-bagel_2.10-1.5.1.jar 
spark-mllib_2.10-1.5.1.jar 
spark-streaming_2.10-1.5.1.jar 
spark-graphx_2.10-1.5.1.jar 
guava-16.0.1.jar 
cassandra-clientutil-3.2.1.jar 
cassandra-driver-core-3.0.0-alpha4.jar 

sopra sono alcune delle principali dipendenze nella mia snap-shot vaso .

Y è il CodecNotFoundException? È a causa del percorso di classe (guava)? o cassandra-driver (cassandra-driver-core-3.0.0-alpha4.jar per datastax cassandra 3.2.1) oa causa del codice.

Un altro punto sono tutte le date che sto inserendo nelle colonne il cui tipo di dati è il timestamp.

Anche quando eseguo uno spark-submit, vedo il percorso della classe nei log, Ci sono altre versioni di guava che sono sotto le librerie di hadoop. R questi causando il problema?

Come si specifica un percorso classe specifico per l'utente mentre si esegue una richiesta di attivazione. Questo aiuterà?

Sarei lieto di ottenere alcuni punti su questi. Grazie

seguito viene descritta la stacktrace

com.datastax.driver.core.exceptions.CodecNotFoundException: Codec not found for requested operation: [timestamp <-> java.lang.String] 
at com.datastax.driver.core.CodecRegistry.notFound(CodecRegistry.java:689) 
at com.datastax.driver.core.CodecRegistry.createCodec(CodecRegistry.java:550) 
at com.datastax.driver.core.CodecRegistry.findCodec(CodecRegistry.java:530) 
at com.datastax.driver.core.CodecRegistry.codecFor(CodecRegistry.java:485) 
at com.datastax.driver.core.AbstractGettableByIndexData.codecFor(AbstractGettableByIndexData.java:85) 
at com.datastax.driver.core.BoundStatement.bind(BoundStatement.java:198) 
at com.datastax.driver.core.DefaultPreparedStatement.bind(DefaultPreparedStatement.java:126) 
at com.cassandra.test.LoadDataToCassandra$1.call(LoadDataToCassandra.java:223) 
at com.cassandra.test.LoadDataToCassandra$1.call(LoadDataToCassandra.java:1) 
at org.apache.spark.api.java.JavaPairRDD$$anonfun$toScalaFunction$1.apply(JavaPairRDD.scala:1027) 
at scala.collection.Iterator$$anon$11.next(Iterator.scala:328) 
at org.apache.spark.util.Utils$.getIteratorSize(Utils.scala:1555) 
at org.apache.spark.rdd.RDD$$anonfun$count$1.apply(RDD.scala:1121) 
at org.apache.spark.rdd.RDD$$anonfun$count$1.apply(RDD.scala:1121) 
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:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 

Ho anche avuto

com.datastax.driver.core.exceptions.CodecNotFoundException: Codec not found for requested operation: [Math.BigDecimal <-> java.lang.String] 
+0

Puoi condividere la traccia dello stack? –

+0

Ho condiviso lo stacktrace –

risposta

10

Quando si chiama bind(params...) su un PreparedStatement il conducente si aspetta di fornire valori w/tipi Java che mappano alla CQL tipi.

Questo errore ([timestamp <-> java.lang.String]) indica che non esiste alcun codec registrato che mappi java String in un cql timestamp. Nel driver java, il tipo timestamp si associa a java.util.Date. In modo da avere 2 opzioni qui:

  1. dove la colonna di essere legato è per un timestamp, forniscono un valore Date -typed invece di un String.
  2. Creare un codec che mappa timestamp <-> String. Per farlo si potrebbe creare sub classe di MappingCodec come descritto sul documentation site, che String mappe per Timestamp:
public class TimestampAsStringCodec extends MappingCodec<String, Date> { 
    public TimestampAsStringCodec() { super(TypeCodec.timestamp(), String.class); } 

    @Override 
    protected Date serialize(String value) { ... } 

    @Override 
    protected String deserialize(Date value) { ... } 
} 

È quindi avrebbe bisogno di registrare il Codec:

cluster.getConfiguration().getCodecRegistry() 
    .register(new TimestampAsStringCodec()); 
+0

Grazie ora fornisco un valore del tipo di data. Un'altra cosa è che il cassandra-driver-core-3.0.0-alpha4.jar è abbastanza stabile? Quando provo altri driver come cassandra-driver-core-3.0.0 o 3.0.1 ottengo la seguente eccezione DEFAULT_SSL_CIPHER_SUITES. –

+0

Per quanto ricordo, non c'erano grossi bug in alpha4, ma detto questo è un alfa e usare una versione rilasciata GA (preferibilmente 3.0.2) sarebbe una scelta migliore. Puoi creare una nuova domanda con il tuo errore DEFAULT_SSL_CIPHER_SUITES? Una modifica apportata nella 3.0 consisteva nel non richiedere che le suite di cifratura venissero dichiarate esplicitamente. Immagino che sia qualcosa a che fare con quello. –

+0

Ho il mio tipo di colonna da tavolo cassandra come timeuuid. Puoi suggerire cosa dovrebbe essere il tipo di dati nella classe Datastax Mapper –

-1

migliore soluzione è fornito here

I mapping corretti che il driver offre per i tipi temporali sono:

DATE  <-> com.datastax.driver.core.LocalDate : use getDate() 
Problemi correlati