簡體   English   中英

帶有spark-cassandra連接器的saveToCassandra會拋出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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM