Ich habe versucht, einen Funke-Job zu bekommen, um für mehrere Tage zum Abschluss zu laufen, und ich konnte es endlich abschließen, aber es gab immer noch eine große Anzahl von fehlgeschlagenen Aufgaben, wo Executors mit getötet wurden die folgende Nachricht:Spark ExecutorLostFailure Speicher überschritten
ExecutorLostFailure (Executor 77 beendet aufgrund einer der ausgeführten Aufgaben) Grund: Container von YARN für das Überschreiten von Speicherlimits getötet. 45,1 GB von 44,9 GB physikalischem Speicher verwendet. Betrachten spark.yarn.executor.memoryOverhead Steigerung
Dies sind die Eigenschaften ich vorbei bin zum Cluster:
[
{
"classification": "spark-defaults",
"properties": {
"spark.executor.memory": "41000m",
"spark.driver.memory": "8000m",
"spark.executor.cores": "6",
"spark.shuffle.service.enabled": "true",
"spark.executor.instances": "98",
"spark.yarn.executor.memoryOverhead": "5000"
}
}
]
Der Cluster besteht aus 20 Maschinen mit jeweils 32 Kernen und 240G Arbeitsspeicher. Sollte ich einfach weiter die Speicherkapazität erhöhen oder gibt es einen Punkt, an dem es ein tieferes Problem anzeigt. Der Fehler dieses Mal schien während einer Verschmelzung von 5000 Partitionen auf 500 vor dem Schreiben der resultierenden Daten auf S3 aufzutreten. Ich vermute, dass die Koaleszenz einen Shuffle verursacht hat und da der Cluster bereits zu wenig Speicher hatte, hat er ihn zu weit getrieben.
Der Arbeitsablauf ist wie folgt:
- Last Parkett- Dateien von s3 in Datenrahmen
- Extract Satz von eindeutigen Schlüsseln, die Gruppe, die die Daten unter Verwendung von SQL-Abfrage für Datenrahmen
- die Datenrahmen zu einem JavaRDD Transformation und Wenden Sie mehrere Kartenfunktionen an
- MapToPair die Daten
combineByKey, das das folgende verwendet, verschmilzt einzelne Objekte im Wesentlichen in Arrays von Objekten nach Schlüssel
combineByKey (neue Funktion, Funktion hinzufügen, Merge-Funktion, neue HashPartitioner (5000), false, null);
Weitere Karten
- Für jede mehrere eindeutige Schlüssel, filtern die rdd nur um Tupel mit diesem Schlüssel dann jede dieser Teilmengen auf der Festplatte bleiben auch nach
Eine andere Frage koaleszierende ist, wie die 44,9 Nummer von oben wird abgeleitet. Ich dachte, der maximale Speicher wäre Executor-Speicher + MemoryOverhead, die 46G nicht 44.9G wäre.
Jede Hilfe wäre sehr dankbar, Nathan
Nathan, du hast eine Antwort geschrieben, hast du nicht gesehen? :) – gsamaras