[英]Saving data from Spark to Cassandra results in java.lang.ClassCastException
[英]saveToCassandra with spark-cassandra connector throws java.lang.ClassCastException
當試圖將數據保存到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
幾乎每個在C *和Spark上工作的人都看到過這類錯誤。 這里解釋了根本原因。
C *驅動程序依賴於相對較新版本的番石榴,而Spark依賴於較舊的番石榴。 要在連接器1.6.2之前解決此問題,您需要在應用程序中顯式嵌入C *驅動程序和guava。
從1.6.2和2.0.0-M3開始,默認連接器附帶正確的C *驅動程序和番石榴陰影。 所以你應該可以只使用項目中包含的連接器工件。
如果您的Spark應用程序使用依賴於C *驅動程序的其他庫,那么事情會變得棘手。 然后你必須手動包括無陰影版本的連接器,正確的C *驅動程序和陰影番石榴並部署一個胖罐。 您基本上制作自己的連接器包。 在這種情況下,您不能再使用--package來啟動Spark集群。
TL;博士
使用連接器1.6.2 / 2.0.0-M3或更高版本。 99%你應該沒事。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.