2016-06-24 10 views
9

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?

Antwort

3

Wie Sie sehen, 11,2 GB ist Ihr maximaler Speicher für einen Behälter von Garn erstellt. Es ist gleich dem Executor-Speicher + Overhead. Daher wird Python-Speicher dafür nicht gezählt.

Exception möchte, dass Sie den Overhead erhöhen, aber Sie können nur den Executor-Speicher erhöhen, ohne den Overhead-Speicher zu erhöhen. Das ist alles, was ich sagen kann, ohne zu wissen, warum Sie so viel Speicher in einem einzigen Executor benötigen, vielleicht ein Cartesian oder etwas ähnliches, das so viel Speicher benötigen kann.

5

Yarn tötet Testamentsvollstrecker, wenn seine

memory usage > (executor-memory + executor.memoryOverhead)

Von Ihrer Einstellung sieht es aus wie es eine gültige Ausnahme.

(memory usage)11.4GB > 11.18GB (executor-memory=6GB + memoryOverhead=5.18GB)

versuchen mit

--conf "spark.yarn.executor.memoryOverhead=6144"

+0

Liebe diese Erklärung. Danke, dass du es echt hast. – deepelement

+0

Hat mir geholfen! Danke – g07kore