带有spark-cassandra连接器的saveToCassandra会抛出java.lang.ClassCastException

nee*_*aji 7 scala apache-spark spark-cassandra-connector

当试图将数据保存到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"))
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激.

更新 根据请求从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>
Run Code Online (Sandbox Code Playgroud)

Spark版本:1.5.2 Cassandra版本:2.2.3

Kai*_*ang 2

几乎所有使用 C* 和 Spark 的人都见过此类错误。这里解释了根本原因。

C* 驱动程序依赖于相对较新版本的 guava,而 Spark 则依赖于较旧版本的 guava。要在连接器 1.6.2 之前解决此问题,您需要在应用程序中显式嵌入 C* 驱动程序和 guava。

从 1.6.2 和 2.0.0-M3 开始,默认情况下连接器附带正确的 C* 驱动程序和番石榴阴影。因此,您应该只需要在项目中包含连接器工件即可。

如果您的 Spark 应用程序使用依赖于 C* 驱动程序的其他库,事情就会变得棘手。然后,您必须手动包含未着色版本的连接器、正确的 C* 驱动程序和着色番石榴,并部署一个 fat jar。您本质上是制作自己的连接器包。在这种情况下,您不能再使用 --package 来启动 Spark 集群。

太长了;博士

使用1.6.2/2.0.0-M3或以上连接器。99%你应该没问题。