java+spark: org.apache.spark.SparkException: Job abgebrochen: Aufgabe nicht serialisierbar: java.io.NotSerializableException
Ich bin neu zu entfachen, und versuchte, um das Beispiel auszuführen JavaSparkPi.java es läuft auch gut, aber da ich dies in einem anderen java-s kopiere ich alle Sachen vom main auf eine Methode in der Klasse und versuchen, rufen Sie die Methode in main, es saids
org.apache.spark.SparkException: Job abgebrochen: Aufgabe nicht serialisierbar:
java.io.NotSerializableException
der code sieht so aus:
public class JavaSparkPi {
public void cal(){
JavaSparkContext jsc = new JavaSparkContext("local", "JavaLogQuery");
int slices = 2;
int n = 100000 * slices;
List<Integer> l = new ArrayList<Integer>(n);
for (int i = 0; i < n; i++) {
l.add(i);
}
JavaRDD<Integer> dataSet = jsc.parallelize(l, slices);
System.out.println("count is: "+ dataSet.count());
dataSet.foreach(new VoidFunction<Integer>(){
public void call(Integer i){
System.out.println(i);
}
});
int count = dataSet.map(new Function<Integer, Integer>() {
@Override
public Integer call(Integer integer) throws Exception {
double x = Math.random() * 2 - 1;
double y = Math.random() * 2 - 1;
return (x * x + y * y < 1) ? 1 : 0;
}
}).reduce(new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer integer, Integer integer2) throws Exception {
return integer + integer2;
}
});
System.out.println("Pi is roughly " + 4.0 * count / n);
}
public static void main(String[] args) throws Exception {
JavaSparkPi myClass = new JavaSparkPi();
myClass.cal();
}
}
jemand ne Idee hierzu? danke!
- Sie entfallen, die wichtigste Zeile in der Fehlermeldung. Was Klasse ist nicht Serialisierbar?
- Exception in thread "main" org.apache.spark.SparkException: Job abgebrochen: Aufgabe nicht serialisierbar: java.io.NotSerializableException: com.MeineFirma.sparkproject2.JavaSparkPi ist Sie es?
- Ich denke, deine Frage wurde hier beantwortet: stackoverflow.com/questions/22592811/...
- Möglich, Duplikat der Aufgabe nicht serialisierbar: java.io.NotSerializableException, wenn die aufrufende Funktion außerhalb Schließung nur auf Klassen, die keine Objekte
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den verschachtelten Funktionen halten eine Referenz auf das enthaltene Objekt (
JavaSparkPi
). Also dieses Objekt wird serialisiert. Damit dies funktioniert, muss es serialisierbar sein. Ganz einfach:Das Hauptproblem ist, dass, wenn Sie eine Anonyme Klasse in java übergeben wird eine Referenz auf die umschließende Klasse.
Dies kann behoben werden, in vielerlei Hinsicht
Erklären der einschließenden Klasse Serializable
Das funktioniert in deinem Fall aber wird fallen flach, im Falle Ihrer umschließenden Klasse hat auch ein paar Felder, die nicht serialisierbar sind. Ich würde auch sagen, dass der Serialisierung der übergeordneten Klasse ist eine totale Verschwendung.
Erstellen Schließung in eine statische Funktion
Erstellen der Schließung durch aufrufen der statischen Funktion nicht, übergeben Sie die Referenz auf die Schließung und damit keine Notwendigkeit zu stellen Sie serializable auf diese Weise.
Dieser Fehler kommt, weil Sie mehrere physische CPUs und in Ihrem lokalen oder cluster-und spark-engine zu senden versuchen Sie diese Funktion, um mehrere CPUs über ein Netzwerk.
Ihre Funktion
verwendet println (), die sich nicht serialisieren. Also die Ausnahme, die ausgelöst durch Spark-Motor.
Die Lösung, die Sie verwenden können unten: