Wie kann ich verhindern, dass der Benutzercache eines Hadoop- oder Spark-Jobs zu viel Speicherplatz in Amazon EMR beansprucht?

Lesedauer: 4 Minute
0

Der Benutzercache für meinen Apache-Hadoop- oder Apache-Spark-Auftrag belegt den gesamten Speicherplatz auf der Partition. Der Amazon-EMR-Auftrag schlägt fehl oder der HDFS-NameNode-Service befindet sich im abgesicherten Modus.

Kurzbeschreibung

In einem Amazon-EMR-Cluster ist YARN so konfiguriert, dass Aufträge Cache-Daten in /mnt/yarn/usercache schreiben können. Wenn Sie große Datenmengen verarbeiten oder mehrere Aufträge gleichzeitig ausführen, kann das /mnt-Dateisystem volllaufen. Dies führt auf einigen Knoten zu Ausfällen des Knoten-Managers, wodurch der Auftrag einfriert oder fehlschlägt.

Verwenden Sie eine der folgenden Methoden, um dieses Problem zu lösen:

  • Passen Sie die Einstellungen für die Aufbewahrung des Benutzercaches für YARN NodeManager an. Wählen Sie diese Option, wenn Sie keine Aufträge mit langer Laufzeit oder Streaming-Aufträge haben.
  • Skalieren Sie die Amazon Elastic Block Store (Amazon EBS)-Volumes. Wählen Sie diese Option, wenn Sie Aufträge mit langer Laufzeit oder Streaming-Aufträge haben.

Lösung

Variante 1: Anpassen der Einstellungen für die Aufbewahrung des Benutzercaches für NodeManager

Die folgenden Attribute definieren die Einstellungen für die Cache-Bereinigung:

  • yarn.nodemanager.localizer.cache.cleanup.interval-ms: Dies ist das Intervall der Cache-Bereinigung. Der Standardwert beträgt 600 000 Millisekunden. Nach Ablauf dieses Intervalls – und wenn die Cache-Größe den in yarn.nodemanager.localizer.cache.target-size-mb festgelegten Wert überschreitet – werden alle Dateien gelöscht, die nicht von laufenden Containern verwendet werden.
  • yarn.nodemanager.localizer.cache.target-size-mb: Dies ist der maximal zulässige Festplattenspeicher für den Cache. Der Standardwert ist 10 240 MB. Wenn die Festplattengröße des Caches diesen Wert überschreitet, werden Dateien, die nicht von laufenden Containern verwendet werden, in dem in yarn.nodemanager.localizer.cache.cleanup.interval-ms festgelegten Intervall gelöscht.

Gehen Sie wie folgt vor, um das Bereinigungsintervall und die maximale Festplattenspeichergröße in einem laufenden Cluster festzulegen:

1.    Öffnen Sie /etc/hadoop/conf/yarn-site.xml auf jedem Core- und Aufgabenknoten und reduzieren Sie die Werte für yarn.nodemanager.localizer.cache.cleanup.interval und yarn.nodemanager.localizer.cache.target-size-mb. Zum Beispiel:

sudo vim /etc/hadoop/conf/yarn-site.xml

yarn.nodemanager.localizer.cache.cleanup.interval-ms 400000
yarn.nodemanager.localizer.cache.target-size-mb 5120

2.    Um den NodeManager-Service neu zu starten, führen Sie die folgenden Befehle auf jedem Core- und Aufgabenknoten aus:

sudo stop hadoop-yarn-nodemanager
sudo start hadoop-yarn-nodemanager

Hinweis: In Release-Versionen ab 5.21.0 von Amazon EMR können Sie auch ein Konfigurationsobjekt wie folgendes verwenden, um die Cluster-Konfiguration zu überschreiben oder zusätzliche Konfigurationsklassifizierungen für einen laufenden Cluster anzugeben. Weitere Informationen finden Sie unter Reconfigure an instance group in a running cluster.

Um das Bereinigungsintervall und die maximale Festplattenspeichergröße in einem neuen Cluster festzulegen, fügen Sie beim Starten des Clusters ein Konfigurationsobjekt wie das folgende hinzu:

[
    {
      "Classification": "yarn-site",
     "Properties": {
       "yarn.nodemanager.localizer.cache.cleanup.interval-ms": "400000",
       "yarn.nodemanager.localizer.cache.target-size-mb": "5120"
      }
    }
]

Denken Sie daran, dass der Löschservice bei laufenden Containern nicht abgeschlossen wird. Das bedeutet, dass selbst nach Anpassung der Einstellungen für die Aufbewahrung des Benutzercaches möglicherweise immer noch Daten in den folgenden Pfad gelangen und das Dateisystem füllen:

{'yarn.nodemanager.local-dirs'}/usercache/user/appcache/application_id ,

Variante 2: Skalieren der EBS-Volumes auf den EMR-Cluster-Knoten

Informationen zur Skalierung des Speichers auf einem laufenden EMR-Cluster finden Sie unter Dynamically scale up storage on Amazon EMR clusters.

Um den Speicher auf einem neuen EMR-Cluster zu skalieren, geben Sie bei der Erstellung des EMR-Clusters eine höhere Volume-Größe an. Sie können dies auch tun, wenn Sie einem vorhandenen Cluster Knoten hinzufügen:

  • Amazon EMR Version 5.22.0 und neuer: Die Standardmenge an EBS-Speicher erhöht sich je nach Größe der Amazon Elastic Compute Cloud (Amazon EC2)-Instance. Weitere Informationen zur Speichermenge und Anzahl der standardmäßig für jeden Instance-Typ zugewiesenen Volumes finden Sie unter Default Amazon EBS storage for instances.
  • Amazon EMR Release-Versionen 5.21 und älter: Die Standardgröße des EBS-Volumes beträgt 32 GB. Davon sind 27 GB für die /mnt-Partition reserviert. HDFS, YARN, der Benutzercache und alle Anwendungen verwenden die /mnt-Partition. Erhöhen Sie die Größe Ihres EBS-Volumes nach Bedarf (z. B. 100–500 GB oder mehr). Sie können auch mehrere EBS-Volumes angeben. Mehrere EBS-Volumes werden als /mnt1, /mnt2 usw. gemountet.

Für Spark-Streaming-Aufgaben können Sie auch einen unpersist (RDD.unpersist()) ausführen, wenn die Verarbeitung abgeschlossen ist und die Daten nicht mehr benötigt werden. Alternativ können Sie in Scala explizit System.gc() (sc._jvm.System.gc () in Python) aufrufen, um JVM Garbage Collection zu starten und die Zwischenspeicherdateien zu entfernen.


AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren