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