Datastax Cassandra 驱动程序抛出 CodecNotFoundException
Datastax Cassandra Driver throwing CodecNotFoundException
具体Exception如下
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 来解决这些问题。
然而,我能够为某些文件加载数据,但对于某些文件,我得到了编解码器异常。当我研究这个问题时,我在同一问题上得到了以下线程。
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 库相关的 class 路径问题,因为 cassandra 3.0 和更高版本使用 guava 16.0.1 并且上面的讨论表明 [=58= 中可能存在较低版本的 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 吗?是因为 class 路径(番石榴)吗?或 cassandra-driver(cassandra-driver-core-3.0.0-alpha4.jar for datastax cassandra 3.2.1)或因为代码 .
另一点是我插入到数据类型为 timestamp 的列的所有日期。
此外,当我执行 spark-submit 时,我在日志中看到 class 路径,hadoop 库下还有其他 guava 版本。 R 这些导致问题 ?
我们如何在执行 spark-submit 时指定用户特定的 class 路径。这会有帮助吗?
很高兴在这些方面得到一些分数。
谢谢
以下是堆栈跟踪
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.call(LoadDataToCassandra.java:223)
at com.cassandra.test.LoadDataToCassandra.call(LoadDataToCassandra.java:1)
at org.apache.spark.api.java.JavaPairRDD$$anonfun$toScalaFunction.apply(JavaPairRDD.scala:1027)
at scala.collection.Iterator$$anon.next(Iterator.scala:328)
at org.apache.spark.util.Utils$.getIteratorSize(Utils.scala:1555)
at org.apache.spark.rdd.RDD$$anonfun$count.apply(RDD.scala:1121)
at org.apache.spark.rdd.RDD$$anonfun$count.apply(RDD.scala:1121)
at org.apache.spark.SparkContext$$anonfun$runJob.apply(SparkContext.scala:1850)
at org.apache.spark.SparkContext$$anonfun$runJob.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]
当您在 PreparedStatement
上调用 bind(params...)
时,驱动程序希望您提供带有映射到 cql 类型的 java 类型的值。
此错误 ([timestamp <-> java.lang.String]
) 告诉您没有注册的编解码器将 java String
映射到 cql timestamp
。在 java 驱动程序中,timestamp
类型映射到 java.util.Date
。所以你在这里有 2 个选项:
- 如果要绑定的列用于时间戳,请提供
Date
类型的值而不是 String
。
- 创建映射
timestamp <-> String
的编解码器。为此,您可以按照 documentation site 中所述创建 MappingCodec
的子 class,将字符串映射到时间戳:
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());
提供更好的解决方案here
The correct mappings that the driver offers out of the box for temporal types are:
DATE <-> com.datastax.driver.core.LocalDate : use getDate()
具体Exception如下
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 来解决这些问题。
然而,我能够为某些文件加载数据,但对于某些文件,我得到了编解码器异常。当我研究这个问题时,我在同一问题上得到了以下线程。
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 库相关的 class 路径问题,因为 cassandra 3.0 和更高版本使用 guava 16.0.1 并且上面的讨论表明 [=58= 中可能存在较低版本的 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 吗?是因为 class 路径(番石榴)吗?或 cassandra-driver(cassandra-driver-core-3.0.0-alpha4.jar for datastax cassandra 3.2.1)或因为代码 .
另一点是我插入到数据类型为 timestamp 的列的所有日期。
此外,当我执行 spark-submit 时,我在日志中看到 class 路径,hadoop 库下还有其他 guava 版本。 R 这些导致问题 ?
我们如何在执行 spark-submit 时指定用户特定的 class 路径。这会有帮助吗?
很高兴在这些方面得到一些分数。 谢谢
以下是堆栈跟踪
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.call(LoadDataToCassandra.java:223)
at com.cassandra.test.LoadDataToCassandra.call(LoadDataToCassandra.java:1)
at org.apache.spark.api.java.JavaPairRDD$$anonfun$toScalaFunction.apply(JavaPairRDD.scala:1027)
at scala.collection.Iterator$$anon.next(Iterator.scala:328)
at org.apache.spark.util.Utils$.getIteratorSize(Utils.scala:1555)
at org.apache.spark.rdd.RDD$$anonfun$count.apply(RDD.scala:1121)
at org.apache.spark.rdd.RDD$$anonfun$count.apply(RDD.scala:1121)
at org.apache.spark.SparkContext$$anonfun$runJob.apply(SparkContext.scala:1850)
at org.apache.spark.SparkContext$$anonfun$runJob.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]
当您在 PreparedStatement
上调用 bind(params...)
时,驱动程序希望您提供带有映射到 cql 类型的 java 类型的值。
此错误 ([timestamp <-> java.lang.String]
) 告诉您没有注册的编解码器将 java String
映射到 cql timestamp
。在 java 驱动程序中,timestamp
类型映射到 java.util.Date
。所以你在这里有 2 个选项:
- 如果要绑定的列用于时间戳,请提供
Date
类型的值而不是String
。 - 创建映射
timestamp <-> String
的编解码器。为此,您可以按照 documentation site 中所述创建MappingCodec
的子 class,将字符串映射到时间戳:
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());
提供更好的解决方案here
The correct mappings that the driver offers out of the box for temporal types are:
DATE <-> com.datastax.driver.core.LocalDate : use getDate()