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 für Amazon EMR gehören unter anderem:

  • sparkLegt die —-Eigenschaft auf "true" oder "false" fest.maximizeResourceAllocation Bei "true" konfiguriert Amazon EMR die spark-defaults-Eigenschaften basierend auf der Cluster-Hardwarekonfiguration. Weitere Informationen finden Sie unter Verwenden von maximizeResourceAllocation.

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

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

  • spark-hive-siteLegt Werte im — für Spark fest.hive-site.xml

  • spark-log4jLegt Werte in der Datei — fest.log4j.properties Einstellungen und weitere Informationen finden Sie in der Datei log4j.properties.template auf Github.

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

Durch festgelegte Spark-StandardeinstellungenAmazon EMR

Die folgende Tabelle zeigt, wie Amazon EMR in spark-defaults Standardwerte für Anwendungen setzt.

Durch festgelegte Spark-StandardeinstellungenAmazon EMR
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 konfiguriert.Amazon EMR.

Konfigurieren der Spark-Speicherbereinigung in Amazon EMR 6.1.0

Das Festlegen benutzerdefinierter Speicherbereinigungskonfigurationen mit spark.driver.extraJavaOptions und spark.executor.extraJavaOptions führt zu Fehlern beim Starten von Treibern oder Executors in Amazon EMR 6.1 aufgrund einer widersprüchlichen Speicherbereinigungskonfiguration in Amazon EMR 6.1.0. FürAmazon EMR 6.1.0 wird die Standardkonfiguration für die Speicherbereinigung über spark.driver.defaultJavaOptions und spark.executor.defaultJavaOptions festgelegt. Diese Konfiguration gilt nur für Amazon EMR 6.1.0. JVM-Optionen, die nicht im Zusammenhang mit der Speicherbereinigung stehen, wie z. B. diejenigen für die Konfiguration der Protokollierung (-verbose:class), können weiterhin über extraJavaOptions festgelegt werden. Weitere Informationen finden Sie unter Spark-Anwendungseigenschaften.

Verwenden von maximizeResourceAllocation

Sie können Executors so konfigurieren, dass sie auf jedem Knoten in einem Cluster Ressourcen im maximal möglichen Umfang nutzen, indem Sie die Konfigurationsklassifikation spark verwenden, um die Option maximizeResourceAllocation auf "true" zu setzen. Diese EMR-spezifische Option berechnet die maximal verfügbaren Rechen- und Speicherressourcen für einen Executor auf einer Instance in der Core-Instance-Gruppe. Dann setzt sie die entsprechenden spark-defaults-Einstellungen basierend auf dieser Informationen.

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

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

spark.driver.memory Größe des Speichers, der für den Treiberprozess verwendet werden soll, d. h., wenn SparkContext initialisiert wird (z. B. 1g, 2g).

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.

Aktivieren der dynamischen Executor-Zuordnung

Mit Spark für YARN kann die Anzahl der für eine Spark-Anwendung verwendeten Executor dynamisch skaliert werden. Bei Verwendung von Amazon EMR Version 4.4.0 und höher ist die dynamische Zuordnung standardmäßig aktiviert. Weitere Informationen finden Sie unter Dynamic Resource Allocation und in den Eigenschaften für Dynamic Allocation in der Spark-Dokumentation.

Verhalten der Außerbetriebnahme von Knoten konfigurieren

Bei Verwendung von Amazon EMR Version 5.9.0 oder höher, enthält Amazon EMR Spark für eine Reihe von Funktionen, mit denen sichergestellt wird, dass Spark die Terminierung der Knoten aufgrund einer manuellen Größenänderung oder aufgrund einer Anforderung aus einer Auto Scaling-Richtlinie zuverlässig ausführt. Amazon EMR implementiert in Spark einen Sperrmechanismus, der auf dem Mechanismus zur Außerbetriebnahme in YARN aufsetzt. 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

Die Einstellung spark.decommissioning.timeout.threshold wurde in Amazon EMR-Version 5.11.0 hinzugefügt, um die Ausfallsicherheit von Spark zu verbessern, wenn Sie Spot-Instances verwenden. 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 Node
Einstellung Beschreibung Standardwert

spark.blacklist.decommissioning.enabled

Wenn die Einstellung auf true gesetzt ist, sperrt Spark die Knoten, die sich in YARN im decommissioning-Zustand 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

Die Zeitspanne, wie lange ein Knoten im Status decommissioning gesperrt wird. Standardmäßig ist dieser Wert auf eine Stunde festgelegt. Dies ist auch der Standardwert für yarn.resourcemanager.decommissioning.timeout. Um sicherzustellen, dass ein Knoten für den gesamten Außerbetriebnahmezeitraum gesperrt wird, setzen Sie diesen Wert auf oder größer als yarn.resourcemanager.decommissioning.timeout. Nach Ablauf des Zeitlimits für die Außerbetriebnahme wechselt der Knoten in einen decommissioned-Status 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 Status „decommissioning“ übergeht und der Host ihn innerhalb der durch diesen Wert festgelegten Frist außer Betrieb nimmt, sperrt Amazon EMR den Knoten nicht nur, sondern bereinigt auch den Host-Status (wie in spark.resourceManager.cleanupExpiredHost angegeben), ohne darauf zu warten, dass der Knoten in den Status „decommissioning“ ü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

Spark ThriftServer-Umgebungsvariable

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

Ändern von Spark-Standardeinstellungen

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.

So erstellen Sie einen Cluster mit der Einstellung "spark.executor.memory": "2g" mithilfe der CLI

  • Erstellen Sie einen Cluster mit installiertem Spark und der Einstellung spark.executor.memory auf 2g, indem Sie den folgenden Befehl verwenden, der auf eine Datei verweist, die in myConfig.json gespeichert ist.Amazon S3

    aws emr create-cluster --release-label emr-5.32.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

    Zur besseren Lesbarkeit sind Linux-Zeilenfortsetzungszeichen (\) enthalten. Sie können entweder entfernt oder in Linux-Befehlen verwendet werden. Ersetzen Sie diese Zeichen unter Windows durch ein Caret-Zeichen (^).

    myConfig.json:

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

So erstellen Sie einen Cluster mit der Einstellung "spark.executor.memory" auf 2g mithilfe der Konsole

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

  2. Wählen Sie Create Cluster (Cluster erstellen) und Go to advanced options (Erweiterte Optionen aufrufen) 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 geben Sie die folgende Konfiguration ein:

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

So legen Sie maximizeResourceAllocation fest

  • Erstellen Sie über die maximizeResourceAllocation einen Cluster mit installiertem Spark und AWS CLI auf „true“ gesetzt, indem Sie auf die Datei myConfig.json verweisen, die in Amazon S3. gespeichert ist.

    aws emr create-cluster --release-label emr-5.32.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

    Zur besseren Lesbarkeit sind Linux-Zeilenfortsetzungszeichen (\) enthalten. Sie können entweder entfernt oder in Linux-Befehlen verwendet werden. Ersetzen Sie diese Zeichen unter Windows durch ein Caret-Zeichen (^).

    myConfig.json:

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

Ab Amazon EMR Version 5.21.0 können Sie Cluster-Konfigurationen überschreiben und zusätzliche Konfigurationsklassifikationen für jede Instance-Gruppe in einem ausgeführten Cluster angeben. Dies erfolgt über die Amazon EMR-Konsole, die AWS Command Line Interface-(AWS CLI) oder das AWS SDK. Weitere Information finden Sie unter Angabe einer Konfiguration für eine Instance-Gruppe in einem ausgeführten Cluster.