java+spark:org.apache.spark.SparkException:Job afbrudt:Opgaven kan ikke serialiseres:java.io.NotSerializableException
De indlejrede funktioner har en reference til det indeholdende objekt (JavaSparkPi
). Så dette objekt bliver serialiseret. For at dette kan fungere, skal det kunne serialiseres. Nem at gøre:
public class JavaSparkPi implements Serializable {
...
Hovedproblemet er, at når du opretter en anonym klasse i java, bliver den bestået en reference til den vedlagte klasse. Dette kan løses på mange måder
Erklærer den omsluttende klasse serialiserbar
Dette virker i dit tilfælde, men vil falde fladt, hvis din omsluttende klasse har et felt, der ikke kan serialiseres. Jeg vil også sige, at serialisering af forældreklassen er totalt spild.
Opret lukningen i en statisk funktion
Oprettelse af lukningen ved at kalde en statisk funktion videregiver ikke referencen til lukningen, og det er derfor ikke nødvendigt at gøre serialiserbar på denne måde.