使用spark-cassandra连接器将文件保存到Cassandra会引发java.lang.ClassCastException异常错误

jaql4c8m  于 2022-11-05  发布在  Cassandra
关注(0)|答案(1)|浏览(126)

当尝试将数据保存到Cassandra(在Scala中)时,我得到以下异常:
java.lang.ClassCastException:无法将默认结果集转换为可监听的未来
请注意,我并不是每次都会得到这个错误,但它偶尔会随机出现,这使得它在生产中更危险。
我使用YARN,并且我有阴影com.google.**以避免Guava符号冲突。
下面是代码片段:

rdd.saveToCassandra(keyspace,"movie_attributes", SomeColumns("movie_id","movie_title","genre"))

任何帮助都将不胜感激。

UPDATE按要求从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

eni9jsuy

eni9jsuy1#

几乎每个在C* 和Spark上工作的人都见过这些类型的错误。这里解释了根本原因。
C* 驱动程序依赖于相对较新的guava版本,而Spark依赖于较旧的guava。要在connector 1.6.2之前解决这个问题,需要在应用程序中显式嵌入C* 驱动程序和guava。
从1.6.2和2.0.0-M3开始,默认连接器附带了正确的C* 驱动程序和Guava阴影。所以你应该可以在你的项目中只包含连接器工件。
如果你的Spark应用程序使用了其他依赖于C* 驱动程序的库,那么事情就变得棘手了。然后你必须手动包含connector的非阴影版本、正确的C* 驱动程序和阴影Guava,并部署一个fat jar。你实际上需要制作自己的connector包。在这种情况下,你不能再使用--package来启动Spark集群了。
医生
使用连接器1.6.2/2.0.0-M3或更高版本。99%应该可以。

相关问题