Ich bin in einer Funken Job einen Fehler bekommen, die mich ist erstaunlich:Wie kann man ein großes Zwischenergebnis vor dem Reduzieren vermeiden?
Total size of serialized results of 102 tasks (1029.6 MB) is
bigger than spark.driver.maxResultSize (1024.0 MB)
Meine Aufgabe ist es wie folgt aus:
def add(a,b): return a+b
sums = rdd.mapPartitions(func).reduce(add)
rdd hat ~ 500 Partitionen und func nimmt die Zeilen in dieser Partition und gibt ein großes Array zurück (ein numpy Array von 1.3M doubles oder ~ 10Mb). Ich möchte alle diese Ergebnisse zusammenfassen und ihre Summe zurückgeben.
Spark scheint das Gesamtergebnis von mapPartitions (func) im Speicher (etwa 5 GB) zu halten, anstatt es inkrementell zu verarbeiten, was nur etwa 30 MB erfordern würde.
Anstatt spark.driver.maxResultSize zu erhöhen, gibt es eine Möglichkeit, die schrittweise zu reduzieren?
Update: Eigentlich bin ich irgendwie überrascht, dass mehr als zwei Ergebnisse jemals im Speicher gehalten werden.