Wie behebe ich den Fehler „Container wurde von YARN wegen Überschreitung der Speicherlimits getötet“ in Spark auf Amazon EMR?

Lesedauer: 5 Minute
0

Ich möchte den Fehler „Container wurde von YARN wegen Überschreitung der Speichergrenzen getötet“ in Spark auf Amazon EMR beheben.

Kurzbeschreibung

Verwenden Sie eine der folgenden Methoden, um diesen Fehler zu beheben:

  • Erhöhen Sie den Speicher-Overhead.
  • Reduzieren Sie die Anzahl der Executor-Kerne.
  • Erhöhen Sie die Anzahl der Partitionen.
  • Erhöhen Sie den Treiber- und Executor-Speicher.

Behebung

Die Grundursache und die geeignete Lösung für diesen Fehler hängen von Ihrem Workload ab. Möglicherweise müssen Sie jede der folgenden Methoden in der folgenden Reihenfolge ausprobieren, um den Fehler zu beheben. Bevor Sie mit der nächsten Methode in dieser Sequenz fortfahren, machen Sie alle Änderungen rückgängig, die Sie im vorherigen Abschnitt an spark-defaults.conf vorgenommen haben.

Erhöhen Sie den Speicheraufwand

Der Speicher-Overhead ist die Menge an Off-Heap-Speicher, die jedem Executor zugewiesen wird. Standardmäßig ist der Speicher-Overhead entweder auf 10 % des Executor-Speichers oder auf 384 festgelegt, je nachdem, welcher Wert höher ist. Der Speicher-Overhead wird für direkte Java-NIO-Puffer, Thread-Stacks, gemeinsam genutzte native Bibliotheken oder speicherzugeordnete Dateien verwendet.

Erwägen Sie, den Speicher-Overhead schrittweise um bis zu 25 % zu erhöhen. Die Summe aus Treiber- oder Executor-Speicher plus Speicher-Overhead muss kleiner sein als yarn.nodemanager.resource.memory-mb für Ihren Instance-Typ.

spark.driver/executor.memory + spark.driver/executor.memoryOverhead < yarn.nodemanager.resource.memory-mb

Wenn der Fehler im Treiber-Container oder Executor-Container auftritt, sollten Sie erwägen, den Speicher-Overhead nur für diesen Container zu erhöhen. Sie können den Speicher-Overhead erhöhen, während der Cluster läuft, wenn Sie einen neuen Cluster starten oder wenn Sie einen Job einreichen.

Auf einem laufenden Cluster:

Ändern Sie spark-defaults.conf auf dem Master-Knoten.

Zum Beispiel:

sudo vim /etc/spark/conf/spark-defaults.conf

spark.driver.memoryOverhead 512
spark.executor.memoryOverhead 512

Auf einem neuen Cluster:

Fügen Sie ein Konfigurationsobjekt hinzu, das dem folgenden ähnelt, wenn Sie einen Cluster starten:

[
  {
    "Classification": "spark-defaults",
    "Properties": {
      "spark.driver.memoryOverhead": "512",
      "spark.executor.memoryOverhead": "512"
    }
  }
]

Für einen einzelnen Job:

Verwenden Sie die Option --conf, um den Speicher-Overhead zu erhöhen, wenn Sie spark-submit ausführen.

Zum Beispiel:

spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --conf spark.driver.memoryOverhead=512 --conf spark.executor.memoryOverhead=512 /usr/lib/spark/examples/jars/spark-examples.jar 100

Wenn eine Erhöhung des Speicher-Overhead das Problem nicht löst, reduzieren Sie die Anzahl der Executor-Kerne.

Reduzieren Sie die Anzahl der Executor-Kerne

Dadurch wird die maximale Anzahl von Aufgaben reduziert, die der Executor ausführen kann, wodurch der benötigte Speicherplatz reduziert wird. Je nachdem, welcher Treiber-Container diesen Fehler auslöst, oder vom anderen Executor-Container, der diesen Fehler erhält, sollten Sie erwägen, die Anzahl der Kerne für den Treiber oder den Executor zu verringern.

Auf einem laufenden Cluster:

Ändern Sie spark-defaults.conf auf dem Master-Knoten.

Zum Beispiel:

sudo vim /etc/spark/conf/spark-defaults.conf
spark.driver.cores  3
spark.executor.cores  3

Auf einem neuen Cluster:

Fügen Sie ein Konfigurationsobjekt hinzu, das dem folgenden ähnelt, wenn Sie einen Cluster starten:

[
  {
    "Classification": "spark-defaults",
    "Properties": {"spark.driver.cores" : "3",
      "spark.executor.cores": "3"
    }
  }
]

Für einen einzelnen Job:

Verwenden Sie die Option --executor-cores, um die Anzahl der Executor-Kerne zu reduzieren, wenn Sie spark-submit ausführen.

Zum Beispiel:

spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --executor-cores 3 --driver-cores 3 /usr/lib/spark/examples/jars/spark-examples.jar 100

Wenn Sie immer noch die Fehlermeldung erhalten, erhöhen Sie die Anzahl der Partitionen.

Erhöhen Sie die Anzahl der Partitionen

Um die Anzahl der Partitionen zu erhöhen, erhöhen Sie den Wert von spark.default.parallelism für rohe, robuste verteilte Datensätze oder führen Sie eine .repartition()-Operation aus. Wenn Sie die Anzahl der Partitionen erhöhen, wird der pro Partition benötigte Speicherplatz reduziert. Spark verwendet Cluster-RAM in hohem Maße als effektive Methode zur Maximierung der Geschwindigkeit. Daher müssen Sie die Speichernutzung mit Ganglia überwachen und dann überprüfen, ob Ihre Cluster-Einstellungen und Ihre Partitionierungsstrategie Ihren wachsenden Datenanforderungen entsprechen. Wenn Sie immer noch die Fehlermeldung „Container getötet von YARN wegen Überschreitung der Speicherlimits“ erhalten, erhöhen Sie den Treiber- und Executor-Speicher.

Erhöhen Sie den Treiber- und Executor-Speicher

Tritt der Fehler in einem Treiber-Container oder einem Executor-Container auf, sollten Sie erwägen, den Arbeitsspeicher entweder für den Treiber oder den Executor zu erhöhen, aber nicht für beide. Stellen Sie sicher, dass die Summe aus Treiber- oder Executor-Arbeitsspeicher plus Treiber- oder Executor-Speicher-Overhead immer kleiner ist als der Wert von yarn.nodemanager.resource.memory-mb für Ihren EC2-Instance-Typ:

spark.driver/executor.memory + spark.driver/executor.memoryOverhead < yarn.nodemanager.resource.memory-mb

Auf einem laufenden Cluster:

Ändern Sie spark-defaults.conf auf dem Master-Knoten.

Beispiel:

sudo vim /etc/spark/conf/spark-defaults.conf

spark.executor.memory  1g
spark.driver.memory  1g

Auf einem neuen Cluster:

Fügen Sie ein Konfigurationsobjekt hinzu, das dem folgenden ähnelt, wenn Sie einen Cluster starten:

[
  {
    "Classification": "spark-defaults",
    "Properties": {
      "spark.executor.memory": "1g",
      "spark.driver.memory":"1g",
    }
  }
]

Für einen einzelnen Job:

Verwenden Sie die Optionen --executor-memory und --driver-memory, um den Arbeitsspeicher zu erhöhen, wenn Sie spark-submit ausführen.

Zum Beispiel:

spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --executor-memory 1g --driver-memory 1g /usr/lib/spark/examples/jars/spark-examples.jar 100

Weitere Behebungsmöglichkeiten

Wenn die Fehlermeldung immer noch angezeigt wird, versuchen Sie Folgendes:

  • **Benchmarking:**Es ist eine bewährte Methode, Ihre Anwendung anhand eines Beispieldatensatzes auszuführen. Auf diese Weise können Sie Verlangsamungen und schiefe Partitionen erkennen, die zu Speicherproblemen führen können.
  • **Datenfilterung:**Stellen Sie sicher, dass Sie die Mindestmenge an Daten verarbeiten. Wenn Sie Ihre Daten nicht oder erst spät in der Anwendungsausführung filtern, können überschüssige Daten die Anwendung verlangsamen. Dies kann die Wahrscheinlichkeit eines Speicherausfalls erhöhen.
  • **Größe des Datensatzes:**Es ist eine bewährte Methode, die mindestens erforderlichen Daten zu verarbeiten. Partitionieren Sie Ihre Daten so, dass nur die erforderlichen Daten aufgenommen werden.
  • **Partitionierungsstrategie:**Erwägen Sie, eine andere Partitionierungsstrategie zu verwenden. Partitionieren Sie beispielsweise mit einem alternativen Schlüssel, um große Partitionen und schiefe Partitionen zu vermeiden.
  • **EC2-Instance-Typ:**Es ist möglich, dass Ihre EC2-Instance nicht über die für Ihre Workload erforderlichen Speicherressourcen verfügt. Der Wechsel zu einem größeren, speicheroptimierten Instance-Typ könnte den Fehler beheben. Wenn Sie nach dem Ändern des Instance-Typs immer noch Speicherausnahmen erhalten, probieren Sie die Methoden zur Fehlerbehebung auf der neuen Instance.

Verwandte Information

Spark-Konfiguration

Wie löse ich die „java.lang.ClassNotFoundException“ in Spark auf Amazon EMR?

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr