L'exception exacte est la suivante
com.datastax.driver.core.exceptions.CodecNotFoundException: codec introuvable pour l'opération demandée: [varchar <-> Java.math.BigDecimal]
Ce sont les versions du logiciel que j'utilise Spark 1.5 Datastax-cassandra 3.2.1 CDH 5.5.1
Le code que j'essaie d'exécuter est un programme Spark utilisant l'api Java et il lit essentiellement les données (csv) de hdfs et les charge dans cassandra tables. J'utilise le connecteur spark-cassandra. J'ai eu beaucoup de problèmes concernant le conflit de la bibliothèque de goyaves de Google initialement que j'ai pu résoudre en ombrant la bibliothèque de goyaves et en créant un instantané pot avec toutes les dépendances.
Cependant, j'ai pu charger des données pour certains fichiers, mais pour certains fichiers, j'obtiens l'exception de codec. Lorsque j'ai fait des recherches sur ce problème, j'ai obtenu les fils suivants sur le même problème.
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
Après avoir parcouru ces discussions, ce que je comprends, c'est que c'est une mauvaise version du pilote cassandra que j'utilise. Ou il y a toujours un problème de chemin de classe lié à la bibliothèque de goyave car cassandra 3.0 et les versions ultérieures utilisent guava 16.0.1 et les discussions ci-dessus disent qu'il pourrait y avoir une version inférieure de la goyave présente dans le chemin de classe.
Voici le fichier 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>
et ce sont les dépendances qui ont été téléchargées en utilisant le pom ci-dessus
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
Ci-dessus se trouvent certaines des principales dépendances de mon pot de snapshots.
Y est l'exception CodecNotFoundException? Est-ce à cause du chemin d'accès aux classes (goyave)? ou cassandra-driver (cassandra-driver-core-3.0.0-alpha4.jar pour datastax cassandra 3.2.1) ou à cause du code.
Un autre point concerne toutes les dates que j'insère dans les colonnes dont le type de données est l'horodatage.
De plus, lorsque je fais une spark-submit, je vois le chemin d'accès aux classes dans les journaux, Il existe d'autres versions de goyave qui se trouvent sous les bibliothèques hadoop. Ces problèmes sont-ils à l'origine du problème?
Comment pouvons-nous spécifier le chemin d'accès à une classe spécifique à l'utilisateur tout en faisant un spark-submit. Cela vous aidera-t-il?
Serait heureux d'obtenir quelques points à ce sujet. Merci
Voici le 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)
J'ai aussi
com.datastax.driver.core.exceptions.CodecNotFoundException: Codec not found for requested operation: [Math.BigDecimal <-> Java.lang.String]
Lorsque vous appelez bind(params...)
sur un PreparedStatement
, le pilote attend de vous que vous fournissiez des valeurs w/Java types qui correspondent aux types cql.
Cette erreur ([timestamp <-> Java.lang.String]
) vous indique qu'il n'existe pas de codec de ce type qui mappe le Java String
à un cql timestamp
. Dans le Java pilote, le type timestamp
correspond à Java.util.Date
. Vous avez donc 2 options ici:
Date
- au lieu d'un String
.timestamp <-> String
. Pour ce faire, vous pouvez créer une sous-classe de MappingCodec
comme décrit sur le site de documentation , qui mappe String à l'horodatage: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) { ... }
}
Vous devrez alors enregistrer le codec:
cluster.getConfiguration().getCodecRegistry()
.register(new TimestampAsStringCodec());
Une meilleure solution est fournie ici
Les mappages corrects proposés par le pilote pour les types temporels sont les suivants:
DATE <-> com.datastax.driver.core.LocalDate : use getDate()