Ich habe eine Spark Python-Anwendung, die von Garn für die Überschreitung der Speichergrenzen getötet wird. Ich habe einen Schritt mit dem Laden einiger Ressourcen, die ein bisschen schwer sind (500 MB), also verwende ich mapPartitions. Grundsätzlich gilt:Python Spark/Garn Speichernutzung
def process_and_output(partition):
resources = load_resources()
for record in partition:
yield transform_record(resources, record)
input = sc.textFile(input_location)
processed = input.mapPartitions(process_and_output)
processed.saveAsTextFile(output_location)
Beim Laufen, ich konsequent diesen Fehler:
ERROR YarnScheduler: Verlorene Testamentsvollstrecker 1 auf (Adresse entfernt): Container von GARN getötet für Speichergrenzen zu überschreiten. 11,4 GB 11,2 GB physischer Speicher verwendet. Ziehen Sie in Erwägung, spark.yarn.executor.memoryOheadhead zu erhöhen.
Ich habe versucht, Speicher zu erhöhenOverhead extrem hoch, aber immer noch das gleiche Problem. Ich lief mit:
--conf "spark.python.worker.memory=1200m" \
--conf "spark.yarn.executor.memoryOverhead=5300" \
--conf "spark.executor.memory=6g" \
Sicher, das ist genug SpeicherOverhead?
Ich denke allgemeiner, ich habe Mühe zu verstehen, wie der Speicher des Python-Arbeiters in der Gesamtmenge gesteuert/gezählt wird. Gibt es eine Dokumentation davon?
Ich würde auch gerne verstehen, ob die Verwendung einer Generatorfunktion tatsächlich die Speichernutzung reduziert. Wird es Daten durch den Python-Prozess streamen (wie ich hoffe) oder wird es alles zwischenspeichern, bevor es zurück an die JVM/Spark-Infrastruktur gesendet wird?
Liebe diese Erklärung. Danke, dass du es echt hast. – deepelement
Hat mir geholfen! Danke – g07kore