2

我使用spark 2.0.0(本地單機)和spark-cassandra-connector 2.0.0-M1scala 2.11。我工作的一個項目上的IDE,每次我跑火花命令我得到星火上卡桑德拉運行失敗,因爲ClassNotFoundException的:com.datastax.spark.connector.rdd.partitioner.CassandraPartition(詳見內)

ClassNotFoundException: com.datastax.spark.connector.rdd.partitioner.CassandraPartition 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:348) 
    at org.apache.spark.serializer.JavaDeserializationStream$$anon$1.resolveClass(JavaSerializer.scala:67) 
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1620) 
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1521) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1781) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) 
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) 
    at org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:75) 
    at org.apache.spark.serializer.JavaSerializerInstance.deserialize(JavaSerializer.scala:114) 
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:253) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

我build.sbt文件

ibraryDependencies += "com.datastax.spark" %% "spark-cassandra-connector" % "2.0.0-M1" 

libraryDependencies += "org.apache.spark" %% "spark-core" % "2.0.0" 

libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.0.0" 

所以基本上這是一個錯誤消息

Caused by: org.apache.spark.SparkException: Job aborted due to stage failure: Task 1 in stage 0.0 failed 4 times, most recent failure: Lost task 1.3 in stage 0.0 (TID 13, 192.168.0.12): java.lang.ClassNotFoundException: com.datastax.spark.connector.rdd.partitioner.CassandraPartition 

的事情是如果我用spark-cassandra連接器運行火花外殼與

$ ./spark-shell --jars /home/Applications/spark-2.0.0-bin-hadoop2.7/spark-cassandra-connector-assembly-2.0.0-M1-22-gab4eda2.jar 

我可以使用spark和cassandra,並且沒有錯誤消息。

關於如何解決這種奇怪的不兼容性的任何線索?

編輯:

這是有趣的,從工作節點的角度來看,當我運行一個程序,連接器給

`java.io.InvalidClassException: com.datastax.spark.connector.rdd.CassandraTableScanRDD; local class incompatible: stream classdesc serialVersionUID = 1517205208424539072, local class serialVersionUID = 6631934706192455668` 

這就是最終給出了ClassNotFound的(它不綁定,因爲的衝突)。但該項目只使用spark and connector 2.0scala 2.11,任何地方都沒有版本不兼容。

回答

2

在Spark中,僅僅因爲您針對庫構建並不意味着它將包含在運行時類路徑中。爲您的應用程序如果在

--jars /home/Applications/spark-2.0.0-bin-hadoop2.7/spark-cassandra-connector-assembly-2.0.0-M1-22-gab4eda2.jar 

添加到您的火花提交它將包括所有的那些必要的庫在運行時和所有遠程JVM的。

所以基本上你看到的是,在第一個例子中,沒有一個連接器庫在運行時類路徑中,在它們的spark-shell示例中。

+0

非常感謝您的回覆!我理解你的意思,但我已經梳理了項目的設置(並將它們與現有的工作設置進行了比較),而且看起來沒有什麼不合適的。然而連接器是唯一不起作用的(火花獨自工作正常)。我正在使用IntelliJ。我檢查了項目結構...->模塊 - >依賴關係,並且兩個罐子都存在,雖然有一個編譯範圍。但是從IntelliJ doc中,編譯範圍也覆蓋了運行時。你有什麼暗示或暗示問題可能出在哪裏? – Mnemosyne

+0

除非您以本地模式運行Master,否則您將遇到上述問題。即使應用程序(Spark Driver)類路徑正確,執行程序也不會。在本地模式下運行主服務器意味着所有內容都將包含在同一個JVM中。這是大多數人用來測試的。 – RussS

+0

我的主人也是當地人。我沒有與外部羣集通信。我還在spark-default.conf文件中添加了我在spark.executor.extraClassPath中構建的jar,並且它在運行時仍不能識別。 Spark shell +(同一個)jar連接器的工作原理,但對我來說這對我的系統沒用。我試圖從頭開始重新創建項目。我複製的唯一東西就是代碼本身。同樣的錯誤。這可能是IntelliJ和新連接器之間的一些錯誤嗎? – Mnemosyne