web-dev-qa-db-fra.com

Comment réparer Java.lang.ClassCastException: impossible d'affecter une instance de scala.collection.immutable.List au type de champ scala.collection.Seq?

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
}
7
user1870400

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")
8
Holger Brandl

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.

4
Ambling

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

1
abaghel

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é.

0
Valeriy K.

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");
0
Nikita Bosik