【问题标题】:Datastax Cassandra Driver throwing CodecNotFoundExceptionDatastax Cassandra 驱动程序抛出 CodecNotFoundException
【发布时间】:2016-10-02 00:09:06
【问题描述】:

确切的异常如下

com.datastax.driver.core.exceptions.CodecNotFoundException:未找到请求操作的编解码器:[varchar java.math.BigDecimal]

这些是我正在使用的软件版本 火花 1.5 Datastax-cassandra 3.2.1 CDH 5.5.1

我尝试执行的代码是一个使用 java api 的 Spark 程序,它基本上从 hdfs 读取数据(csv)并将其加载到 cassandra 表中。我正在使用 spark-cassandra-connector。我最初遇到了很多关于 google 的 guava 库冲突的问题,我可以通过对 guava 库进行着色并构建一个包含所有依赖项的快照 jar 来解决这些问题。

但是,我能够为某些文件加载​​数据,但对于某些文件,我得到了 Codec Exception 。当我研究这个问题时,我得到了关于同一问题的以下线程。

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

经过这些讨论后,我了解到要么是我正在使用的 cassandra-driver 的错误版本。或者仍然存在与 guava 库相关的类路径问题,因为 cassandra 3.0 和更高版本使用 guava 16.0.1,并且上面的讨论说类路径中可能存在较低版本的 guava。

这里是 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>

这些是使用上述 pom 下载的依赖项

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

以上是我的快照 jar 中的一些主要依赖项。

Y 是 CodecNotFoundException 吗?是因为类路径(番石榴)吗?或 cassandra-driver(cassandra-driver-core-3.0.0-alpha4.jar 用于 datastax cassandra 3.2.1)或因为代码。

另一点是我插入到数据类型为 timestamp 的列中的所有日期。

另外,当我进行 spark-submit 时,我在日志中看到类路径,hadoop libs 下还有其他番石榴版本。 R这些导致问题?

在进行 spark-submit 时,我们如何指定用户特定的类路径。这会有帮助吗?

很高兴在这些方面获得一些分数。 谢谢

下面是堆栈跟踪

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)

我也有

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

【问题讨论】:

  • 你能分享堆栈跟踪吗?
  • 我已经分享了堆栈跟踪

标签: guava datastax cloudera-cdh datastax-java-driver spark-cassandra-connector


【解决方案1】:

当您在 PreparedStatement 上调用 bind(params...) 时,驱动程序希望您提供映射到 cql 类型的带有 java 类型的值。

此错误 ([timestamp &lt;-&gt; java.lang.String]) 告诉您没有注册这样的编解码器来将 java String 映射到 cql timestamp。在 java 驱动程序中,timestamp 类型映射到 java.util.Date。所以你有两个选择:

  1. 如果绑定的列用于时间戳,请提供Date 类型的值,而不是String
  2. 创建映射timestamp &lt;-&gt; String 的编解码器。为此,您可以创建MappingCodec 的子类,如documentation site 所述,将字符串映射到时间戳:
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) { ... }
}

然后您需要注册编解码器:

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

【讨论】:

  • 谢谢我现在提供一个日期类型值。还有一件事是 cassandra-driver-core-3.0.0-alpha4.jar 足够稳定吗?当我尝试 cassandra-driver-core-3.0.0 或 3.0.1 等其他驱动程序时,我收到以下异常 DEFAULT_SSL_CIPHER_SUITES 错误。
  • 据我记得,alpha4 中没有任何重大错误,但据说它是 alpha 并且使用 GA 发布版本(最好是 3.0.2)会是更好的选择。您可以使用 DEFAULT_SSL_CIPHER_SUITES 错误创建一个新问题吗?在 3.0 中进行的一项更改是不需要明确说明密码套件。我猜这与此有关。
  • 我的 cassandra 表列类型为 timeuuid。你能建议 Datastax Mapper 类中的数据类型应该是什么
  • @VinodJayachandran 您将扩展 MappingCodec&lt;String, UUID&gt; 并在构造函数中调用 super(TypeCodec.timeUUID(), String.class);
【解决方案2】:

提供更好的解决方案here

驱动程序为时间类型提供开箱即用的正确映射是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-27
    • 2017-01-20
    • 2018-02-15
    • 2013-12-23
    • 2015-10-25
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多