Scala 由于ClassNotFoundException:com.datasax.Spark.connector.rdd.partitioner.CassandraPartition(内部详细信息),在Cassandra上运行Spark失败

Scala 由于ClassNotFoundException:com.datasax.Spark.connector.rdd.partitioner.CassandraPartition(内部详细信息),在Cassandra上运行Spark失败,scala,apache-spark,cassandra,classnotfoundexception,spark-cassandra-connector,Scala,Apache Spark,Cassandra,Classnotfoundexception,Spark Cassandra Connector,我使用的是spark 2.0.0(本地单机版)和spark cassandra连接器2.0.0-M1和scala 2.11。我正在IDE上做一个项目,每次运行spark命令时,我都会得到 ClassNotFoundException: com.datastax.spark.connector.rdd.partitioner.CassandraPartition at java.net.URLClassLoader.findClass(URLClassLoader.java:381)

我使用的是
spark 2.0.0
(本地单机版)和
spark cassandra连接器2.0.0-M1
scala 2.11
。我正在IDE上做一个项目,每次运行spark命令时,我都会得到

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外壳

$ ./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和connector 2.0
scala 2.11
,任何地方都没有版本不兼容。

在spark中,仅仅因为您根据库进行构建并不意味着它将包含在运行时类路径中。如果你加入

--jars  /home/Applications/spark-2.0.0-bin-hadoop2.7/spark-cassandra-connector-assembly-2.0.0-M1-22-gab4eda2.jar
为了让spark提交应用程序,它将在运行时和所有远程JVM上包含所有必要的库


因此,基本上您看到的是,在第一个示例中,没有一个连接器库位于运行时类路径上,而在spark shell示例中,它们位于运行时类路径上。

非常感谢您的回复!我明白你的意思,但我已经梳理了项目的设置(并将它们与现有的工作设置进行了比较),似乎没有任何问题。然而,连接器是唯一不起作用的东西(spark本身就可以很好地工作)。我正在使用IntelliJ。我检查了项目结构…->Module->Dependencies,两个JAR都存在,尽管它们的范围是compile。但从IntelliJ文档来看,编译范围也包括运行时。您是否有任何提示或暗示问题可能存在于何处?除非您在本地模式下运行Master,否则您将遇到上述问题。即使应用程序(Spark驱动程序)类路径正确,执行器也不会正确。在本地模式下运行主机意味着所有内容都将包含在同一个JVM中。这是大多数人用来测试的。我的主人也是本地人。我没有与外部群集通信。我还在spark-default.conf文件中添加了我在spark.executor.extraClassPath中构建的jar,但在运行时仍然无法识别它。Spark shell+(相同的)jar连接器可以工作,但这对我的系统没有任何用处。我试图从头开始重建这个项目。我复制的唯一东西就是代码本身。同样的错误。这可能是IntelliJ和新连接器之间的错误吗?如果主机不在本地模式,jar完全解决了,我什么都没有。这可能是番石榴冲突的问题,但我不认为这会在这里表现出来。为了进行健全性检查,请尝试在任何并行工作之前使用该类驱动程序端,如果该类驱动程序端有效,请尝试将其反映出来,并查看它是否被拾取。确实如此。我还有第二个(较旧的)项目,它运行在spark和cassandra connecor的早期版本上,并且工作完美。在那里导入了我当前项目的新类,没有任何问题。现在,您可能会想,为什么不再次使用相同的依赖项(spark和connector 1.6),我确实使用了,但我启动的每个新项目都会为具有不同SerialVersionUID的spark提供InvalidClassException。我开始认为可能是我的PC环境造成的,因为我有一个2个月的工作项目,每个新项目(相同的依赖项)都会抛出一些错误。。。。。