Wie behebe ich „Kein Speicherplatz mehr auf dem Gerät“-Phasenfehler in Spark auf Amazon EMR?

Lesedauer: 3 Minute
0

Ich habe eine Apache Spark-Anwendung an einen Amazon EMR-Cluster übermittelt. Die Anwendung schlägt fehl und es wird ein Fehler in der Phase „Kein Speicherplatz mehr auf dem Gerät“ angezeigt, der dem folgenden ähnlich ist: Der Job wurde aufgrund eines Phasenfehlers abgebrochen: Aufgabe 31 in Phase 8.0 ist viermal fehlgeschlagen, letzter Fehler: Aufgabe 31.3 in Phase 8.0 verloren (TID 2036, ip-xxx-xxx-xx-xxx.compute.internal, executor 139): org.apache.spark.memory.sparkOutOfMemoryError: Fehler beim Aufrufen von spill() auf org.apache.spark.util.collection.unsafe.sort.UnsafeExternalSorter@1a698b89: Kein Speicherplatz mehr auf dem Gerät

Kurzbeschreibung

Spark verwendet lokale Festplatten auf den Kern- und Aufgabenknoten, um Zwischendaten zu speichern. Wenn der Speicherplatz auf den Festplatten knapp wird, schlägt der Job mit dem Fehler „Kein Speicherplatz mehr auf dem Gerät“ fehl. Verwenden Sie eine der folgenden Methoden, um diesen Fehler zu beheben:

  • Fügen Sie mehr Amazon Elastic Block Store (Amazon EBS)-Kapazität hinzu.
  • Fügen Sie weitere Spark-Partitionen hinzu.
  • Verwenden Sie eine Bootstrap-Aktion, um den Speicher auf den Kern- und Aufgabenknoten dynamisch zu skalieren. Weitere Informationen und ein Beispiel für ein Bootstrap-Aktionsskript finden Sie unter Dynamisches Skalieren von Speicher auf Amazon EMR-Clustern.

Behebung

Mehr EBS-Kapazität hinzufügen

Für neue Cluster: Größere EBS-Volumes verwenden

Starten Sie einen Amazon EMR-Cluster und wählen Sie einen Amazon Elastic Compute Cloud (Amazon EC2)-Instance-Typ mit größeren EBS-Volumes. Weitere Informationen zur Speichergröße und Anzahl der Volumes, die jedem Instance-Typ zugewiesen sind, finden Sie unter Amazon EBS-Standardspeicher für Instances.

Für laufende Cluster: Weitere EBS-Volumes hinzufügen

  1. Wenn größere EBS-Volumes das Problem nicht lösen, fügen Sie weitere EBS-Volumes an die Kern- und Aufgabenknoten an.

  2. Formatieren und mounten Sie die angehängten Volumes. Achten Sie darauf, die richtige Festplattennummer zu verwenden (z. B. /mnt1 oder /mnt2 statt /data).

  3. Stellen Sie über SSH eine Verbindung zum Knoten her.

  4. Erstellen Sie ein /mnt2/yarn-Verzeichnis und legen Sie dann den YARN-Benutzer als Eigentümer des Verzeichnisses fest:

sudo mkdir /mnt2/yarn
chown yarn:yarn /mnt2/yarn
  1. Fügen Sie das Verzeichnis /mnt2/yarn in die Eigenschaft yarn.nodemanager.local-dirs von /etc/hadoop/conf/yarn-site.xml ein. Beispiel:
<property>
    <name>yarn.nodemanager.local-dirs</name>
    <value>/mnt/yarn,/mnt1/yarn,/mnt2/yarn</value>
</property>
  1. Starten Sie den NodeManager-Dienst neu:
sudo stop hadoop-yarn-nodemanager
sudo start hadoop-yarn-nodemanager

Weitere Spark-Partitionen hinzufügen

Je nachdem, wie viele Kern- und Aufgabenknoten sich im Cluster befinden, sollten Sie erwägen, die Anzahl der Spark-Partitionen zu erhöhen. Verwenden Sie den folgenden Scala-Code, um weitere Spark-Partitionen hinzuzufügen:

val numPartitions = 500
val newDF = df.repartition(numPartitions)

Verwandte Informationen

Wie kann ich Phasenfehler in Spark-Jobs auf Amazon EMR beheben?

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 3 Jahren