此错误一直是最难追踪的。我不确定发生了什么。我正在我的位置机器上运行Spark集群。所以整个火花集群都在一个主机127.0.0.1
下,我在独立模式下运行
JavaPairRDD<byte[], Iterable<CassandraRow>> cassandraRowsRDD= javaFunctions(sc).cassandraTable("test", "hello" )
.select("rowkey", "col1", "col2", "col3", )
.spanBy(new Function<CassandraRow, byte[]>() {
@Override
public byte[] call(CassandraRow v1) {
return v1.getBytes("rowkey").array();
}
}, byte[].class);
Iterable<Tuple2<byte[], Iterable<CassandraRow>>> listOftuples = cassandraRowsRDD.collect(); //ERROR HAPPENS HERE
Tuple2<byte[], Iterable<CassandraRow>> tuple = listOftuples.iterator().next();
byte[] partitionKey = tuple._1();
for(CassandraRow cassandraRow: tuple._2()) {
System.out.println("************START************");
System.out.println(new String(partitionKey));
System.out.println("************END************");
}
此错误一直是最难追踪的。它显然发生在cassandraRowsRDD.collect()
,我不知道为什么?
16/10/09 23:36:21 ERROR Executor: Exception in task 2.3 in stage 0.0 (TID 21)
java.lang.ClassCastException: cannot assign instance of scala.collection.immutable.List$SerializationProxy to field org.apache.spark.rdd.RDD.org$apache$spark$rdd$RDD$$dependencies_ of type scala.collection.Seq in instance of org.apache.spark.rdd.MapPartitionsRDD
at java.io.ObjectStreamClass$FieldReflector.setObjFieldValues(ObjectStreamClass.java:2133)
at java.io.ObjectStreamClass.setObjFieldValues(ObjectStreamClass.java:1305)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2006)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1924)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2000)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1924)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:75)
at org.apache.spark.serializer.JavaSerializerInstance.deserialize(JavaSerializer.scala:114)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
at org.apache.spark.scheduler.Task.run(Task.scala:85)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:274)
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)
以下是我使用的版本
Scala code runner version 2.11.8 // when I run scala -version or even ./spark-shell
compile group: 'org.apache.spark' name: 'spark-core_2.11' version: '2.0.0'
compile group: 'org.apache.spark' name: 'spark-streaming_2.11' version: '2.0.0'
compile group: 'org.apache.spark' name: 'spark-sql_2.11' version: '2.0.0'
compile group: 'com.datastax.spark' name: 'spark-cassandra-connector_2.11' version: '2.0.0-M3':
我的gradle文件在引入名为&#34;提供&#34;的内容后看起来像这样。实际上似乎不存在,但谷歌说创建一个所以我的build.gradle看起来像这样
group 'com.company'
version '1.0-SNAPSHOT'
apply plugin: 'java'
apply plugin: 'idea'
repositories {
mavenCentral()
mavenLocal()
}
configurations {
provided
}
sourceSets {
main {
compileClasspath += configurations.provided
test.compileClasspath += configurations.provided
test.runtimeClasspath += configurations.provided
}
}
idea {
module {
scopes.PROVIDED.plus += [ configurations.provided ]
}
}
dependencies {
compile 'org.slf4j:slf4j-log4j12:1.7.12'
provided group: 'org.apache.spark', name: 'spark-core_2.11', version: '2.0.0'
provided group: 'org.apache.spark', name: 'spark-streaming_2.11', version: '2.0.0'
provided group: 'org.apache.spark', name: 'spark-sql_2.11', version: '2.0.0'
provided group: 'com.datastax.spark', name: 'spark-cassandra-connector_2.11', version: '2.0.0-M3'
}
jar {
from { configurations.provided.collect { it.isDirectory() ? it : zipTree(it) } }
// with jar
from sourceSets.test.output
manifest {
attributes 'Main-Class': "com.company.batchprocessing.Hello"
}
exclude 'META-INF/.RSA', 'META-INF/.SF', 'META-INF/*.DSA'
zip64 true
}
答案 0 :(得分:9)
我有同样的问题,可以通过将我的应用程序的jar添加到spark的类路径来解决它
spark = SparkSession.builder()
.appName("Foo")
.config("spark.jars", "target/scala-2.11/foo_2.11-0.1.jar")
答案 1 :(得分:4)
我遇到了同样的例外,并且已经深入研究了多个相关的Jiras(9219,12675,18075)。
我认为异常名称令人困惑,真正的问题是spark群集和驱动程序应用程序之间的不一致的环境设置。
例如,我使用conf/spark-defaults.conf
中的以下行启动了我的Spark群集:
spark.master spark://master:7077
当我用一行开始我的驱动程序(甚至程序以spark-submit
启动时):
sparkSession.master("spark://<master ip>:7077")
其中<master ip>
是节点master
的正确IP地址,但由于这种简单的不一致,程序将失败。
因此,我建议所有驱动程序应用程序都以spark-submit
启动,并且不要在驱动程序代码中复制任何配置(除非您需要覆盖某些配置)。也就是说,让spark-submit
在运行的Spark集群中以相同的方式设置您的环境。
答案 2 :(得分:1)
你call()方法应该返回如下的byte []。
@Override
public byte[] call(CassandraRow v1) {
return v1.getBytes("rowkey").array();
}
如果您仍然遇到问题,请检查Jira中提到的依赖项版本https://issues.apache.org/jira/browse/SPARK-9219
答案 3 :(得分:0)
在我的情况下,我必须添加spark-avro
jar(我把它放在主jar旁边的/lib
文件夹中):
SparkSession spark = SparkSession.builder().appName("myapp").getOrCreate();
...
spark.sparkContext().addJar("lib/spark-avro_2.11-4.0.0.jar");
答案 4 :(得分:0)
检查代码 - 在Intellij中:分析... - &gt;检查代码。如果您已弃用与序列化相关的方法,请修复它。或者只是尝试减少Spark o Scala版本。在我的情况下,我将Scala版本减少到2.10并且一切正常。
答案 5 :(得分:0)
尝试不要使用.master(“ spark:// hadoop001:7077”)并使用.master(“ local [2]”)解决了我的问题
答案 6 :(得分:0)
我在 Eclipse 中在 Spark 集群中的一个节点(即 ubuntu box)上运行我的工作时遇到了同样的问题。 我将 UDF 创建为单独的 java 类。在本地运行 spark 时一切正常,但转向 yarn 会引发与问题相同的异常。
我通过将生成的类的路径放到 spark classpath 中解决了这个问题,其中包含类似于 Holger Brandl 建议的 UDF 类。
我为类路径创建了一个变量:
String cpVar = "..../target/classes"
并添加到 spark 作为配置变量:
.config("spark.driver.extraClassPath", cpVar)
.config("spark.executorEnv.CLASSPATH", cpVar)
编辑:
添加classpath的路径只解决了driver节点,集群中的其他节点仍然可能有同样的错误。我得到的最终解决方案是在每次构建后将生成的类放入 hdfs,并将类路径设置为 hdfs 文件夹以用于 spark,如下所示。
sparkSession.sparkContext().addJar("hdfs:///user/.../classes");
请看TheMP
的回答