使用spark-cassandra连接器的saveToCassandra引发java.lang.ClassCastException

7
尝试保存数据到Cassandra(使用Scala)时,我遇到了以下异常:

java.lang.ClassCastException: com.datastax.driver.core.DefaultResultSetFuture 无法转换为 com.google.common.util.concurrent.ListenableFuture

请注意,我并不总是会遇到这个错误,但它会随机出现,这在生产环境中更加危险。
我正在使用YARN,并且已经将com.google.**阴影化以避免Guava符号冲突。
下面是代码片段:
rdd.saveToCassandra(keyspace,"movie_attributes", SomeColumns("movie_id","movie_title","genre"))

任何帮助都将不胜感激。 更新 根据要求添加来自pom文件的详细信息:
<dependency>
    <groupId>com.datastax.spark</groupId>
    <artifactId>spark-cassandra-connector_2.10</artifactId>
    <version>1.5.0</version>
</dependency>
<dependency>
    <groupId>com.datastax.spark</groupId>
    <artifactId>spark-cassandra-connector-java_2.10</artifactId>
    <version>1.5.0</version>
</dependency>

**Shading guava**

<relocation> <!-- Conflicts between Cassandra Java driver and YARN -->
    <pattern>com.google</pattern>
    <shadedPattern>oryx.com.google</shadedPattern>
    <includes>
         <include>com.google.common.**</include>
    </includes>
 </relocation>

Spark版本:1.5.2 Cassandra版本:2.2.3


你能分享一下你正在使用的Cassandra版本,连接器版本和Spark版本,以及你是如何将库进行Shaded处理的吗? - Christophe Schmitz
@Christophe,我已经更新了问题以反映组件版本号。 - neeraj baji
我有同样的问题。它出现在一个单元测试中。当在IntelliJ中运行测试时,它可以正常工作,但是sbt myProject/test失败了。 - rabejens
1个回答

2
几乎所有使用 C* 和 Spark 的人都见过这些类型的错误。其根本原因在此处已有解释。
C* 驱动程序依赖于相对较新版本的 guava,而 Spark 依赖于较旧版本的 guava。在 connector 1.6.2 之前解决此问题需要您明确地嵌入 C* 驱动程序和 guava 到您的应用中。
自从 1.6.2 和 2.0.0-M3 版本以来,默认情况下连接器会附带正确的 C* 驱动程序和 guava shaded。所以您只需要将连接器 artifact 包含在您的项目中即可。
如果您的 Spark 应用程序使用了其他依赖于 C* 驱动程序的库,则必须手动包含未经 shaded 处理的 connector、正确的 C* 驱动程序和 shaded guava,并部署一个 fat jar 。您本质上是在自己创建连接器包。在这种情况下,您无法再使用 --package 启动 Spark 集群。
总结:使用 connector 1.6.2/2.0.0-M3 或更高版本即可,99% 情况下,您应该没有问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接