Konfigurieren von Spark - Amazon EMR

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Konfigurieren von Spark

Sie können Spark auf Amazon EMR mithilfe von Konfigurationsklassifizierungen konfigurieren. Weitere Informationen zur Verwendung von Konfigurationsklassifizierungen finden Sie unter Konfigurieren von Anwendungen.

Zu den Konfigurationsklassifizierungen für Spark auf Amazon EMR gehören:

  • spark— Setzt diemaximizeResourceAllocation Eigenschaft auf „Wahr“ oder „Falsch“. Wenn wahr, konfiguriert Amazon EMR automatischspark-defaults Eigenschaften basierend auf der Cluster-Hardwarekonfiguration. Weitere Informationen finden Sie unter Verwenden maximizeResourceAllocation.

  • spark-defaults— Legt Werte in derspark-defaults.conf Datei fest. Weitere Informationen finden Sie unter Spark-Konfiguration in der Spark-Dokumentation.

  • spark-env— Legt Werte in derspark-env.sh Datei fest. Weitere Informationen finden Sie unter Umgebungsvariablen in der Spark-Dokumentation.

  • spark-hive-site— Legt Werte inhive-site.xml für Spark fest.

  • spark-log4j— (Amazon EMR Versionen 6.7.x und niedriger) Legt Werte in derlog4j.properties Datei fest. Weitere Informationen finden Sie in der log4j.properties.template-Datei auf Github.

  • spark-log4j2— (Amazon EMR Versionen 6.8.0 und höher) Legt Werte in derlog4j2.properties Datei fest. Weitere Informationen finden Sie in der Datei log4j2.properties.template auf Github.

  • spark-metrics— Legt Werte in dermetrics.properties Datei fest. Einstellungen und weitere Informationen finden Sie in der metrics.properties.template-Datei auf GitHub und unter Metrics in der Spark-Dokumentation.

Anmerkung

Wenn Sie Spark-Workloads von einer anderen Plattform zu Amazon EMR migrieren, empfehlen wir Ihnen, Ihre Workloads mit dem zu testen,Von Amazon EMR EMR R R R R R R R R R R.. bevor Sie benutzerdefinierte Konfigurationen hinzufügen. Die meisten Kunden sehen mit unseren Standardeinstellungen eine verbesserte Leistung.

Von Amazon EMR EMR R R R R R R R R R R..

Die folgende Tabelle zeigt, wie Amazon EMR Standardwerte festlegtspark-defaults, die sich auf Anwendungen auswirken.

Von Amazon EMR EMR R R R R R R R R R R..
Einstellung Beschreibung Wert
spark.executor.memory Die pro Executor-Prozess zu verwendende Größe des Speichers (beispielsweise 1g, 2g).

Die Einstellung wird auf der Grundlage der Core- und der Aufgaben-Instance-Typen im Cluster konfiguriert.

spark.executor.cores Die für jeden Executor zu verwendende Anzahl der Kerne. Die Einstellung wird auf der Grundlage der Core- und der Aufgaben-Instance-Typen im Cluster konfiguriert.
spark.dynamicAllocation.enabled Legt fest, ob eine dynamische Ressourcenzuordnung verwendet wird. Dabei wird die Anzahl der in einer Anwendung registrierten Executor auf der Grundlage der Workload angepasst.

"true" (emr-4.4.0 oder höher)

Anmerkung

Spark Shuffle Service wird automatisch von Amazon EMR konfiguriert.

Konfiguration von Spark-Garbage Collection auf Amazon EMR 6.1.0

Das Festlegen benutzerdefinierter Garbage-Collection-Konfigurationen mitspark.driver.extraJavaOptions undspark.executor.extraJavaOptions führt zu einem Fehler beim Treiber- oder Executor-Start mit Amazon EMR 6.1 aufgrund einer widersprüchlichen Garbage-Collection-Konfiguration mit Amazon EMR 6.1.0. ForAmazon EMR 6.1.0, die Standardkonfiguration für die Müllabfuhr wird durchspark.driver.defaultJavaOptions und festgelegtspark.executor.defaultJavaOptions. Diese Konfiguration gilt nur für Amazon EMR 6.1.0. JVM-Optionen, die nichts mit der Garbage-Erfassung zu tun haben, z. B. die für die Konfiguration von logging (-verbose:class), können weiterhin über diese Option gesetzt werdenextraJavaOptions. Weitere Informationen finden Sie unter Eigenschaften der von der von der von der von der von der von der

Verwenden maximizeResourceAllocation

Um Ihre Executors so zu konfigurieren, dass sie die maximal möglichen Ressourcen auf jedem Knoten in einem Cluster verwenden, setzenmaximizeResourceAllocation Sietrue in Ihrerspark Konfigurationsklassifizierung auf. DasmaximizeResourceAllocation ist spezifisch für Amazon EMR. Wenn Sie diese Option aktivierenmaximizeResourceAllocation, berechnet EMR die maximalen Rechen- und Speicherressourcen, die für einen Executor auf einer Instance in der Core-Instanzgruppe verfügbar sind. Anschließend werden die entsprechendenspark-defaults Einstellungen auf der Grundlage der berechneten Maximalwerte festgelegt.

Anmerkung

Sie sollten diemaximizeResourceAllocation Option nicht auf Clustern mit anderen verteilten Anwendungen wie HBase verwenden. Amazon EMR verwendet benutzerdefinierte YARN-Konfigurationen für verteilte Anwendungen, die zu Konflikten mit Spark-Anwendungen führenmaximizeResourceAllocation und zum Ausfall führen können.

Im Folgenden finden Sie ein Beispiel für eine Spark-Konfigurationsklassifizierung mitmaximizeResourceAllocation set totrue.

[ { "Classification": "spark", "Properties": { "maximizeResourceAllocation": "true" } } ]
Einstellungen, die in spark-defaults konfiguriert sind, wenn maximizeResourceAllocation aktiviert ist
Einstellung Beschreibung Wert
spark.default.parallelism Standardanzahl von Partitionen in RDDs, die durch Transformationen wie Join und Parallelize zurückgegeben werden reduceByKey, wenn sie nicht vom Benutzer festgelegt wurden.

Die zweifache Anzahl von CPU-Kernen für YARN-Container.

spark.driver.memory Menge des Speichers, der für den Treiberprozess verwendet werden soll, d. h. wo SparkContext wird initialisiert. (zum Beispiel 1 g, 2 g).

Die Einstellung wird auf der Grundlage der Instance-Typen im Cluster konfiguriert. Da die Spark-Treiberanwendung jedoch entweder in der Master-Instance oder in einer der Core-Instances ausgeführt werden kann (z. B. im YARN-Client- und -Cluster-Modus), wird sie auf der Grundlage des kleineren Instance-Typs in diesen beiden Instance-Gruppen festgelegt.

spark.executor.memory Die pro Executor-Prozess zu verwendende Größe des Speichers (beispielsweise 1g, 2g).

Die Einstellung wird auf der Grundlage der Core- und der Aufgaben-Instance-Typen im Cluster konfiguriert.

spark.executor.cores Die für jeden Executor zu verwendende Anzahl der Kerne. Die Einstellung wird auf der Grundlage der Core- und der Aufgaben-Instance-Typen im Cluster konfiguriert.
spark.executor.instances Die Anzahl der Executor.

Die Einstellung wird auf der Grundlage der Core- und der Aufgaben-Instance-Typen im Cluster konfiguriert. Festgelegt, wenn spark.dynamicAllocation.enabled nicht gleichzeitig explizit auf "true" festgelegt wurde.

Verhalten bei der Außerbetriebnahme von Knoten konfigurieren

Wenn Sie die Amazon EMR-Version 5.9.0 oder höher verwenden, enthält Spark auf Amazon EMR eine Reihe von Funktionen, mit denen sichergestellt werden kann, dass Spark die Kündigung von Knoten aufgrund einer manuellen Größenänderung oder einer automatischen Skalierungsrichtlinienanfrage ordnungsgemäß verarbeitet. Amazon EMR implementiert in Spark einen Deny-Listing-Mechanismus, der auf dem Stilllegungsmechanismus von YARN aufbaut. Dieser Mechanismus hilft sicherzustellen, dass keine neuen Aufgaben in einem Knoten geplant werden, der außer Betrieb genommen wird. Gleichzeitig werden bereits begonnene Aufgaben abgeschlossen. Darüber hinaus gibt es Funktionen, mit deren Hilfe Spark-Aufgaben schneller wiederhergestellt werden, wenn Shuffle-Blöcke bei der Beendigung eines Knotens verloren gehen. Der Neuberechnungsprozess wird früher ausgelöst und ist optimiert, um eine schnellere Neuberechnung mit weniger Stufenwiederholungen zu ermöglichen. Außerdem kann vermieden werden, dass Aufträge infolge von fehlenden Shuffle-Blöcken fehlschlagen.

Wichtig

Diespark.decommissioning.timeout.threshold Einstellung wurde in Amazon EMR-Version 5.11.0 hinzugefügt, um die Spark-Ausfallsicherheit bei der Verwendung von Spot-Instances zu verbessern. Wenn in früheren Versionen ein Knoten eine Spot-Instance verwendet und die Instance aufgrund des Bid-Preises beendet wird, kann Spark die Beendigung möglicherweise nicht zuverlässig beenden. Aufträge können fehlschlagen und Shuffle-Neuberechnungen können eine geraume Zeit in Anspruch nehmen. Aus diesem Grund empfehlen wir die Nutzung von Version 5.11.0 oder höher, wenn Sie Spot-Instances verwenden.

Einstellungen für die Außerbetriebnahme von Spark-Nodes
Einstellung Beschreibung Standardwert

spark.blacklist.decommissioning.enabled

Wenn diese Option auf gesetzt isttrue, listet Spark Deny Knoten auf, die sich imdecommissioning Status in YARN befinden. Spark plant keine neuen Aufgaben auf Executors aus, die auf dem betreffenden Knoten ausgeführt werden. Bereits begonnene Aufgaben werden abgeschlossen.

true

spark.blacklist.decommissioning.timeout

Gibt an, wie lange ein Knoten imdecommissioning Status Deny gelistet ist. Standardmäßig ist dieser Wert auf eine Stunde festgelegt. Dies ist auch die Standardeinstellung für yarn.resourcemanager.decommissioning.timeout. Um sicherzustellen, dass ein Knoten für seinen gesamten Stilllegungszeitraum in der Liste „Verweigert“ aufgeführt ist, legen Sie diesen Wert gleich oder größer als festyarn.resourcemanager.decommissioning.timeout. Nach Ablauf des Stilllegungs-Timeouts geht der Knoten in einendecommissioned Zustand über, und Amazon EMR kann die EC2-Instance des Knotens beenden. Wenn noch Aufgaben ausgeführt werden, nachdem die Zeitbeschränkung abgelaufen ist, gehen diese verloren oder werden abgebrochen und auf Executors, die auf anderen Knoten ausgeführt werden, verschoben.

1h

spark.decommissioning.timeout.threshold

Verfügbar in Amazon EMR-Version 5.11.0 oder höher. In Sekunden angegeben. Wenn ein Knoten in den Stilllegungszustand übergeht und der Host innerhalb eines Zeitraums außer Betrieb genommen wird, der diesem Wert entspricht oder kleiner ist, verweigert Amazon EMR nicht nur die Liste des Knotens, sondern bereinigt auch den Host-Status (wie von angegebenspark.resourceManager.cleanupExpiredHost), ohne darauf zu warten, dass der Knoten in einen stillgelegten Zustand übergeht. Auf diese Weise kann Spark das Beenden von Spot-Instances besser verarbeiten, weil Spot-Instances innerhalb eines Timeouts von 20 Sekunden außer Betrieb genommen werden, unabhängig von dem Wert von yarn.resourcemager.decommissioning.timeout, sodass andere Knoten möglicherweise nicht genügend Zeit haben, Shuffle-Dateien zu lesen.

20s

spark.resourceManager.cleanupExpiredHost

Wenn die Einstellung auf true gesetzt ist, löscht Spark alle zwischengespeicherten Daten und Shuffle-Blöcke, die in Executors in Knoten gespeichert sind, die sich im Zustand decommissioned befinden. Dadurch wird der Wiederherstellungsprozess beschleunigt.

true

spark.stage.attempt.ignoreOnDecommissionFetchFailure

Wenn die Einstellung auf true gesetzt ist, wird verhindert, dass in Spark Stufen und letztendlich Aufträge wegen zu vieler Abrufe von außer Betrieb genommenen Knoten fehlschlagen. Fehler beim Abrufen von Shuffle-Blöcken von einem Knoten im Zustand decommissioned werden nicht zu der maximal zulässigen Anzahl von aufeinander folgenden Abruffehlern hinzugezählt.

true

ThriftServer Spark-Umgebungsvariable

Spark legt die Hive-Thrift-Server-Port-Umgebungsvariable HIVE_SERVER2_THRIFT_PORT auf "10001" fest.

Spark-Standardeinstellungen ändern

Sie ändern die Standardwerte in spark-defaults.conf mit der Konfigurationsklassifizierungspark-defaults oder der Einstellung maximizeResourceAllocation in der Konfigurationsklassifizierung spark.

In den folgenden Verfahren wird gezeigt, wie Sie Einstellungen mithilfe der CLI oder der Konsole ändern.

Um einen Cluster zu erstellen, bei dem spark.executor.memory mithilfe der CLI auf 2 g gesetzt ist

  • Erstellen Sie mit dem folgenden Befehl, der auf eine Datei verweist, die in Amazon S3myConfig.json gespeichert ist, einen Cluster, auf dem Spark installiert und auf 2gspark.executor.memory gesetzt ist.

    aws emr create-cluster --release-label emr-5.36.0 --applications Name=Spark \ --instance-type m5.xlarge --instance-count 2 --service-role EMR_DefaultRole --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json
    Anmerkung

    Linux-Zeilenfortsetzungszeichen (\) sind aus Gründen der Lesbarkeit enthalten. Sie können entfernt oder in Linux-Befehlen verwendet werden. Entfernen Sie sie für Windows oder ersetzen Sie sie durch ein Caret (^).

    myConfig.json:

    [ { "Classification": "spark-defaults", "Properties": { "spark.executor.memory": "2G" } } ]

Um mit der Konsole einen Cluster zu erstellen, bei dem spark.executor.memory auf 2g gesetzt ist

  1. Öffnen Sie die Amazon-EMR-Konsole unter https://console.aws.amazon.com/emr.

  2. Wählen Sie Create Cluster (Cluster erstellen) und Go to advanced options (Zu erweiterten Optionen) aus.

  3. Wählen Sie Spark aus.

  4. Lassen Sie unter Edit software settings (Softwareeinstellungen bearbeiten) die Option Enter configuration (Konfiguration eingeben) ausgewählt und nehmen Sie folgende Konfiguration vor:

    classification=spark-defaults,properties=[spark.executor.memory=2G]
  5. Wählen Sie andere Optionen aus, dann und anschließend Create cluster (Cluster erstellen).

Zum Einstellen maximizeResourceAllocation

  • Erstellen Sie einen Cluster, auf dem Spark installiert und auf truemaximizeResourceAllocation gesetzt ist. Verwenden Sie dazu die OptionAWS CLI, die auf eine Datei verweistmyConfig.json, in Amazon S3 gespeichert ist.

    aws emr create-cluster --release-label emr-5.36.0 --applications Name=Spark \ --instance-type m5.xlarge --instance-count 2 --service-role EMR_DefaultRole --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json
    Anmerkung

    Linux-Zeilenfortsetzungszeichen (\) sind aus Gründen der Lesbarkeit enthalten. Sie können entfernt oder in Linux-Befehlen verwendet werden. Entfernen Sie sie für Windows oder ersetzen Sie sie durch ein Caret (^).

    myConfig.json:

    [ { "Classification": "spark", "Properties": { "maximizeResourceAllocation": "true" } } ]
Anmerkung

Mit Amazon EMR Version 5.21.0 und höher können Sie Cluster-Konfigurationen überschreiben und zusätzliche Konfigurationsklassifizierungen für jede Instanzgruppe in einem laufenden Cluster angeben. Dazu verwenden Sie die Amazon EMR-Konsole, dieAWS Command Line Interface (AWS CLI) oder dasAWS SDK. Weitere Informationen finden Sie unter Bereitstellen einer Konfiguration für eine Instanzgruppe in einem laufenden Cluster.

Migration von Apache Log4j 1.x zu Log4j 2.x

Apache Spark veröffentlicht 3.2.x und frühere Versionen verwenden den älteren Apache Log4j 1.x und dielog4j.properties Datei zur Konfiguration von Log4j in Spark-Prozessen. Apache Spark Versionen 3.3.0 und höher verwenden Apache Log4j 2.x und dielog4j2.properties Datei, um Log4j in Spark-Prozessen zu konfigurieren.

Wenn Sie Apache Spark Log4j mit einer Amazon EMR-Version unter 6.8.0 konfiguriert haben, müssen Sie die älterespark-log4j Konfigurationsklassifizierung entfernen und auf die Konfigurationsklassifizierung und dasspark-log4j2 Schlüsselformat migrieren, bevor Sie ein Upgrade auf Amazon EMR 6.8.0 oder höher durchführen können. Diespark-log4j Legacy-Klassifizierung führt dazu, dass die Cluster-Erstellung mit einemValidationException Fehler in Amazon EMR-Versionen 6.8.0 und höher fehlschlägt. Ein Fehler im Zusammenhang mit der Log4j-Inkompatibilität wird Ihnen nicht in Rechnung gestellt, aber Sie müssen die nicht mehr existierendespark-log4j Konfigurationsklassifizierung entfernen, um fortzufahren.

Weitere Informationen zur Migration von Apache Log4j 1.x zu Log4j 2.x finden Sie im Apache Log4j Migration Guide und im Spark Log4j 2-Template auf Github.

Anmerkung

Bei Amazon EMR verwendet Apache Spark einelog4j2.properties Datei anstelle der XML-Datei, die im Apache Log4j Migration Guide beschrieben wird. Außerdem empfehlen wir nicht, die Log4j 1.x-Bridge-Methode zur Konvertierung in Log4j 2.x zu verwenden.