web-dev-qa-db-fra.com

Datastax Cassandra Driver lançant CodecNotFoundException

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]
10

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:

  1. Lorsque la colonne étant liée est pour un horodatage, fournissez une valeur de type Date- au lieu d'un String.
  2. Créez un codec qui mappe 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());
15
Andy Tolbert

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()
0
NGR