Cette erreur a été la plus difficile à retracer. Je ne suis pas sûr de ce qui se passe. J'exécute un cluster Spark sur mon ordinateur de localisation. de sorte que l'ensemble du cluster d'allumage est sous un hôte qui est 127.0.0.1
et je cours en mode autonome
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************");
}
Cette erreur a été la plus difficile à retracer. Cela se passe clairement à cassandraRowsRDD.collect()
et je ne sais pas pourquoi?
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)
Voici les versions que j'utilise
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':
mon fichier de classement ressemble à ceci après l'introduction de quelque chose appelé "fourni" qui ne semble pas exister, mais Google a dit d'en créer un de sorte que mon build.gradle ressemble à ceci
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
}
J'ai eu le même problème et je pouvais le résoudre en ajoutant le fichier jar de mon application au chemin de classe de spark
spark = SparkSession.builder()
.appName("Foo")
.config("spark.jars", "target/scala-2.11/foo_2.11-0.1.jar")
J'ai frappé la même exception et ai creusé dans plusieurs Jiras connexes ( 9219 , 12675 , 18075 ).
Je crois que le nom de l'exception prête à confusion et que le véritable problème réside dans les paramètres d'environnement inconsistent entre le cluster d'étincelles et l'application de pilote.
Par exemple, j'ai démarré mon cluster Spark avec la ligne suivante dans conf/spark-defaults.conf
:
spark.master spark://master:7077
pendant que je démarrais mon programme de pilote (même le programme est lancé avec spark-submit
) avec une ligne:
sparkSession.master("spark://<master ip>:7077")
dans lequel le <master ip>
est l'adresse IP correcte du nœud master
, mais le programme échouerait en raison de cette incohérence simple.
Par conséquent, je recommanderais que toutes les applications de pilote soient lancées avec spark-submit
et ne dupliquent aucune configuration du code de pilote (sauf si vous devez remplacer certaines configurations). En d'autres termes, laissez simplement le spark-submit
définir votre environnement de la même manière dans le cluster Spark en cours d'exécution.
Vous appelez la méthode () devrait retourner byte [] comme ci-dessous.
@Override
public byte[] call(CassandraRow v1) {
return v1.getBytes("rowkey").array();
}
Si le problème persiste, vérifiez les versions de vos dépendances mentionnées dans Jira https://issues.Apache.org/jira/browse/SPARK-9219
Vérifiez votre code - Dans Intellij: Analyser ... -> Inspecter le code. Si vous avez des méthodes obsolètes liées à la sérialisation, corrigez-le. Ou essayez simplement de réduire la version de Spark o Scala. Dans mon cas, je réduis la version de Scala à la version 2.10 et tout a fonctionné.
Dans mon cas, j'ai dû ajouter spark-avro
jar (je l'ai mis dans le dossier /lib
à côté du fichier principal):
SparkSession spark = SparkSession.builder().appName("myapp").getOrCreate();
...
spark.sparkContext().addJar("lib/spark-avro_2.11-4.0.0.jar");