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

时间:2016-05-18 12:50:41

标签: 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"))

非常感谢任何帮助。

更新 根据要求从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

1 个答案:

答案 0 :(得分:2)

几乎所有使用C *和Spark的人都看到过这类错误。根本原因解释为here

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

从1.6.2和2.0.0-M3开始,默认情况下,连接器附带正确的C *驱动程序和番石榴阴影。所以你应该可以只使用项目中包含的连接器工件。

如果您的Spark应用程序使用依赖于C *驱动程序的其他库,那么事情会变得棘手。然后你必须手动包括无阴影版本的连接器,正确的C *驱动程序和阴影番石榴并部署一个胖罐。您基本上制作自己的连接器包。在这种情况下,您不能再使用--package来启动Spark集群。

TL;博士

使用连接器1.6.2 / 2.0.0-M3或更高版本。 99%你应该没事。