Comment réparer java.lang.ClassCastException: impossible d'assigner une instance de la scala.collection.immuable.Liste type de champ scala.collection.Seq?
Cette erreur a été le plus difficile à retracer. Je ne suis pas sûr de ce qui se passe. Je suis en cours d'exécution d'une Étincelle de cluster sur mon emplacement de la machine. donc, l'ensemble de l'étincelle de cluster est en vertu d'un hôte qui est 127.0.0.1
et je fonctionne sur un 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é le plus difficile à retracer. C'est clairement arrive à 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'utiliser
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 gradle fichier ressemble à ceci après l'introduction de quelque chose appelé "condition" qui, en fait, il ne semble pas exister, mais google dit de créer une donc 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 fixé ce, à l'aide de la fourche scala-sbt.org/release/docs/Forking.html
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème et pourrait résoudre en ajoutant de mon application jar pour étincelle du classpath avec
map
opération à l'aide d'un lambda qui se réfère à des méthodes/classes de votre projet, vous devez fournir comme autre bocal. L'étincelle ne sérialise le lambda lui-même, mais n'est pas de rassembler ses dépendances. Je ne sais pas pourquoi le message d'erreur n'est pas instructif à tous.J'ai frappé de la même exception et ont creuser dans plusieurs Jiras (Neuf mille deux cent dix neuf, Douze mille six cent soixante quinze, Dix huit mille soixante quinze).
Je crois que le nom de l'exception est source de confusion, et le vrai problème est le incompatible paramètres d'environnement entre l'étincelle de cluster et le pilote de l'application.
Par exemple, j'ai commencé mon Étincelle de cluster avec la ligne suivante dans
conf/spark-defaults.conf
:alors que j'ai commencé mon programme de pilote (même le programme est lancé avec
spark-submit
) avec une ligne:dans lequel le
<master ip>
est l'adresse IP du nœudmaster
, mais le programme pourrait échouer à cause de cette simple incohérence.En conséquence, je recommande que toutes les applications de pilote sont a commencé avec
spark-submit
et de ne pas dupliquer une configuration dans le code de pilote (sauf si vous avez besoin de remplacer certains de config). À savoir, il suffit de laisser lespark-submit
ensemble de votre environnement à l'aide de la même façon dans le fonctionnement de l'Étincelle de cluster.Vous méthode call() doit retourner byte[] comme ci-dessous.
Si vous avez encore de la question est alors de vérifier les versions de vos dépendances comme mentionné dans Jira https://issues.apache.org/jira/browse/SPARK-9219
Dans mon cas, j'ai dû ajouter
spark-avro
pot (je l'ai mis dans/lib
dossier à côté du principal jar):Vous de vérifier de code Dans l'Ide: Analyser... -> Inspecter le code. Si vous avez des méthodes obsolètes liées à la sérialisation de le corriger. Ou tout simplement essayer de réduire Étincelle o Scala version. Dans mon cas, j'ai de réduire la Scala version 2.10 et tous travaillé.
essayez de ne pas utiliser .maître("l'étincelle://hadoop001:7077") et de l'utilisation .maître("local[2]") a résolu mon problème