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 mit Konfigurationsklassifizierungen konfigurieren. Weitere Informationen über Konfigurationsklassifizierungen finden Sie unter Anwendungen konfigurieren.

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

  • spark – Setzt die maximizeResourceAllocation-Eigenschaft auf „wahr“ oder „falsch“. Wenn der Wert wahr ist, konfiguriert Amazon EMR automatisch spark-defaults Eigenschaften auf der Grundlage der Cluster-Hardwarekonfiguration. Weitere Informationen finden Sie unter Verwenden von maximizeResourceAllocation.

  • spark-defaults – Setzt Werte in der spark-defaults.conf-Datei. Weitere Informationen finden Sie unter Spark-Konfiguration in der Spark-Dokumentation.

  • spark-env – Setzt Werte in der spark-env.sh-Datei. Weiter Informationen finden Sie unter Umgebungsvariablen in der Spark-Dokumentation.

  • spark-hive-site – Legt Werte in der hive-site.xml für Spark fest.

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

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

  • spark-metrics – Setzt Werte in der metrics.properties-Datei. 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 EMR von einer anderen Plattform zu Amazon migrieren, empfehlen wir Ihnen, Ihre Workloads mit der zu testen, Von Amazon festgelegte Spark-Standardeinstellungen EMR bevor Sie benutzerdefinierte Konfigurationen hinzufügen. Die meisten Kunden sehen mit unseren Standardeinstellungen eine verbesserte Leistung.

Von Amazon festgelegte Spark-Standardeinstellungen EMR

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

Von Amazon festgelegte Spark-Standardeinstellungen EMR
Einstellung Beschreibung Standardwert
spark.executor.memory

Die pro Executor-Prozess zu verwendende Größe des Speichers. Zum Beispiel: 1g, 2g.

Diese Einstellung wird durch die Core- und Aufgaben-Instance-Typen im Cluster bestimmt.

spark.executor.cores

Die für jeden Executor zu verwendende Anzahl der Kerne.

Diese Einstellung wird durch die Core- und Aufgaben-Instance-Typen im Cluster bestimmt.

spark.dynamicAllocation.enabled

Wenn „wahr“, verwenden Sie die dynamische Ressourcenzuteilung, um die Anzahl der bei einer Anwendung registrierten Executoren basierend auf dem Workload nach oben oder unten zu skalieren.

true(mit Amazon EMR 4.4.0 und höher)

Anmerkung

Der Spark-Shuffle-Service wird automatisch von Amazon EMR konfiguriert.

spark.sql.hive.advancedPartitionPredicatePushdown.enabled

Wenn der Wert „wahr“ ist, ist der erweiterte Pushdown von Partitionsprädikaten in den Hive-Metastore aktiviert.

true
spark.sql.hive.stringLikePartitionPredicatePushdown.enabled

Verschiebt und filtert startsWith, contains und endsWith nach unten in den Hive-Metastore.

Anmerkung

Glue unterstützt das Prädikat-Pushdown für startsWith, contains oder endsWith nicht. Wenn Sie Glue Metastore verwenden und aufgrund des Prädikat-Pushdowns für diese Funktionen auf Fehler stoßen, setzen Sie diese Konfiguration auf false.

true

Konfiguration der Spark-Garbage-Collection auf Amazon EMR 6.1.0

Das Einrichten von benutzerdefinierten Garbage-Collection-Konfigurationen mit spark.driver.extraJavaOptions und spark.executor.extraJavaOptions führt dazu, dass der Treiber- oder Executor-Start mit Amazon EMR 6.1 fehlschlägt, weil eine Konfiguration der Garbage-Collection-Konfiguration mit Amazon 6.1.0 in Konflikt steht. EMR Für Amazon EMR 6.1.0 wird die Standardkonfiguration für die Garbage-Collection über spark.driver.defaultJavaOptions und spark.executor.defaultJavaOptions festgelegt. Diese Konfiguration gilt nur für Amazon EMR 6.1.0. JVMOptionen, die nichts mit der Garbage-Collection zu tun haben, wie z. B. die für die Konfiguration von logging (-verbose:class), können trotzdem verwendet werden. extraJavaOptions Weitere Informationen finden Sie unter Spark-Anwendungs-Eigenschaften.

Verwenden von maximizeResourceAllocation

Um Ihre Executors so zu konfigurieren, dass sie auf jedem Knoten in einem Cluster die maximal möglichen Ressourcen nutzen, setzen Sie in Ihrer spark-Konfigurationsklassifizierung maximizeResourceAllocation auf true. Das maximizeResourceAllocation ist spezifisch für AmazonEMR. Wenn Sie diese Option aktivierenmaximizeResourceAllocation, EMR berechnet Amazon die maximalen Rechen- und Speicherressourcen, die für einen Executor auf einer Instance in der Core-Instance-Gruppe verfügbar sind. Anschließend werden die entsprechenden spark-defaults-Einstellungen auf der Grundlage der berechneten Höchstwerte festgelegt.

Amazon EMR berechnet die maximalen Rechen- und Speicherressourcen, die für einen Executor verfügbar sind, basierend auf einem Instance-Typ aus der Core-Instance-Flotte. Da jede Instance-Flotte unterschiedliche Instance-Typen und Größen innerhalb einer Flotte haben kann, ist die von Amazon EMR verwendete Executor-Konfiguration möglicherweise nicht die beste für Ihre Cluster. Daher empfehlen wir nicht, die Standardeinstellungen zu verwenden, wenn Sie die maximale Ressourcenzuweisung verwenden. Konfigurieren Sie benutzerdefinierte Einstellungen für Ihre Instance-Flottencluster.

Anmerkung

Sie sollten die maximizeResourceAllocation Option nicht für Cluster mit anderen verteilten Anwendungen wie verwendenHBase. Amazon EMR verwendet benutzerdefinierte YARN Konfigurationen für verteilte Anwendungen, was zu Konflikten mit Spark-Anwendungen führen maximizeResourceAllocation und zum Ausfall führen kann.

Im Folgenden finden Sie ein Beispiel für eine Spark-Konfigurationsklassifizierung mit der maximizeResourceAllocation-Einstellung auf true.

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

Zweimal so viele CPU Kerne stehen Containern zur Verfügung. YARN

spark.driver.memory Speichermenge, die für den Treiberprozess verwendet werden soll, d. h. wo er initialisiert SparkContext wird. (zum Beispiel 1 g, 2 g).

Die Einstellung wird auf der Grundlage der Instance-Typen im Cluster konfiguriert. Da die Spark-Treiberanwendung jedoch entweder auf der primären oder auf einer der Kerninstanzen ausgeführt werden kann (z. B. im YARN Client- bzw. Cluster-Modus), wird dies auf der Grundlage des kleineren Instanztyps in diesen beiden Instanzgruppen 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 der Außerbetriebnahme von Knoten konfigurieren

Mit der EMR Amazon-Version 5.9.0 und höher EMR enthält Spark on Amazon eine Reihe von Funktionen, die sicherstellen, dass Spark die Knotenbeendigung aufgrund einer manuellen Größenänderung oder einer automatischen Skalierungsrichtlinienanforderung ordnungsgemäß verarbeitet. Amazon EMR implementiert in Spark einen Deny-Listing-Mechanismus, der auf dem Mechanismus YARN zur Außerbetriebnahme 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

Die spark.decommissioning.timeout.threshold Einstellung wurde in EMR Amazon-Version 5.11.0 hinzugefügt, um die Spark-Resilienz 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 abschliessen. 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 diese Option auf gesetzt isttrue, listet Spark Deny Knoten auf, die sich im decommissioning Status In befinden. YARN 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 die Standardeinstellung für yarn.resourcemanager.decommissioning.timeout. Um sicherzustellen, dass ein Knoten über den gesamten Außerbetriebnahme-Zeitraum gesperrt wird, setzen Sie diesen Wert größer oder gleich 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 Instanz des EC2 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 EMR Amazon-Version 5.11.0 oder höher. In Sekunden angegeben. Wenn ein Knoten in den Status Außerbetriebnahme übergeht und der Host innerhalb eines Zeitraums außer Betrieb genommen wird, der diesem Wert entspricht oder darunter liegt, listet Amazon den Knoten EMR nicht nur auf, 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.

Ändern von Spark-Standardeinstellungen

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

Die folgenden Verfahren zeigen, wie Sie Einstellungen mit der CLI OR-Konsole ändern.

Um einen Cluster zu erstellen, bei dem spark.executor.memory auf 2g gesetzt ist, verwenden Sie CLI
  • Erstellen Sie einen Cluster mit installiertem Spark und spark.executor.memory auf 2G gesetzt, indem Sie den folgenden Befehl eingeben, der auf die Datei myConfig.json verweist, die in Amazon S3 gespeichert ist.

    aws emr create-cluster --release-label emr-7.2.0 --applications Name=Spark \ --instance-type m5.xlarge --instance-count 2 --service-role EMR_DefaultRole_V2 --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 unter Windows oder ersetzen Sie sie durch ein Caret-Zeichen (^).

    myConfig.json:

    [ { "Classification": "spark-defaults", "Properties": { "spark.executor.memory": "2G" } } ]
Erstellen Sie einen Clustermithilfe der Konsole mit der Einstellung „spark.executor.memory“ auf „2G“ wie folgt
  1. Navigieren Sie zur neuen EMR Amazon-Konsole und wählen Sie in der Seitennavigation die Option Zur alten Konsole wechseln aus. Weitere Informationen darüber, was Sie erwartet, wenn Sie zur alten Konsole wechseln, finden Sie unter Verwenden der alten Konsole.

  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 true maximizeResourceAllocation gesetzt ist AWS CLI, indem Sie die in Amazon S3 gespeicherte Datei referenzierend verwenden. myConfig.json

    aws emr create-cluster --release-label emr-7.2.0 --applications Name=Spark \ --instance-type m5.xlarge --instance-count 2 --service-role EMR_DefaultRole_V2 --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 unter Windows oder ersetzen Sie sie durch ein Caret-Zeichen (^).

    myConfig.json:

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

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

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

Apache-Spark-Versionen 3.2.x und frühere Versionen verwenden den älteren Apache Log4j 1.x und die log4j.properties-Datei, um Log4j in Spark-Prozessen zu konfigurieren. Apache-Spark-Versionen 3.3.0 und höher verwenden Apache Log4j 2.x und die Datei log4j2.properties, um Log4j in Spark-Prozessen zu konfigurieren.

Wenn Sie Apache Spark Log4j mit einer EMR Amazon-Version vor 6.8.0 konfiguriert haben, müssen Sie die alte spark-log4j Konfigurationsklassifizierung entfernen und zur Konfigurationsklassifizierung und zum Schlüsselformat migrieren, bevor Sie ein Upgrade auf Amazon EMR 6.8.0 oder höher durchführen können. spark-log4j2 Die spark-log4j Legacy-Klassifizierung führt dazu, dass die Clustererstellung in EMR Amazon-Versionen 6.8.0 und höher mit einem ValidationException Fehler fehlschlägt. Ein Fehler im Zusammenhang mit der Log4j-Inkompatibilität wird Ihnen nicht in Rechnung gestellt. Sie müssen jedoch die Klassifizierung für die veraltete spark-log4j-Konfiguration entfernen, um fortzufahren.

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

Anmerkung

Bei Amazon EMR verwendet Apache Spark eine log4j2.properties Datei anstelle der im Apache Log4j Migration Guide beschriebenen .xml-Datei. Außerdem empfehlen wir nicht, die Log4j-1.x-Bridge-Methode für die Konvertierung nach Log4j 2.x zu verwenden.