In diesem Dokument finden Sie Informationen zum Autoscaling von Managed Service for Apache Spark. Wenn Sie Ihre Spark-Arbeitslast senden, kann Managed Service for Apache Spark Arbeitslastressourcen wie die Anzahl der Executors dynamisch skalieren, um Ihre Arbeitslast effizient auszuführen. Das Autoscaling von Managed Service for Apache Spark ist das Standardverhalten und verwendet die dynamische Ressourcenzuweisung von Spark, um zu bestimmen, ob, wie und wann Ihre Arbeitslast skaliert werden soll.
Autoscaling V2 für Managed Service for Apache Spark
Die Autoscaling-Version 2 (V2) von Managed Service for Apache Spark bietet zusätzliche Funktionen und Verbesserungen im Vergleich zur Standardversion 1 (V1). So können Sie Arbeitslasten in Managed Service for Apache Spark besser verwalten, die Arbeitslastleistung verbessern und Kosten sparen:
- Asynchrone Knotenskalierung: Bei Autoscaling V2 wird die synchrone Skalierung von V1 durch die asynchrone Skalierung ersetzt. Beim asynchronen Herunterskalieren skaliert Managed Service for Apache Spark Arbeitslastressourcen herunter, ohne darauf zu warten, dass die Shuffle-Migration auf allen Knoten abgeschlossen ist. Das bedeutet, dass Longtail-Knoten, die langsam skaliert werden, die Aufwärtsskalierung nicht blockieren.
- Intelligente Auswahl von Knoten zum Herunterskalieren: Bei Autoscaling V2 wird die zufällige Knotenauswahl von V1 durch einen intelligenten Algorithmus ersetzt, der die besten Knoten zum Herunterskalieren ermittelt. Dieser Algorithmus berücksichtigt Faktoren wie die Größe der Shuffle-Daten des Knotens und die Leerlaufzeit.
- Konfigurierbares Verhalten für die Spark-Graceful-Decommissioning- und Shuffle-Migration: Mit Autoscaling V2 können Sie Standard-Spark-Properties verwenden, um das Spark-Graceful-Decommissioning und die Shuffle-Migration zu konfigurieren. Mit dieser Funktion können Sie die Migrationskompatibilität mit Ihren benutzerdefinierten Spark-Attributen aufrechterhalten.
Autoscaling-Funktionen von Managed Service for Apache Spark
| Funktion | Managed Service for Apache Spark-Autoscaling V1 | Autoscaling V2 für Managed Service for Apache Spark |
| Herunterskalieren von Knoten | Synchron | Asynchron |
| Knotenauswahl für das Herunterskalieren | Zufällig | Intelligent |
| Ordnungsgemäße Außerbetriebnahme von Spark und Migration von Shuffle | Nicht konfigurierbar | Konfigurierbar |
Attribute für die dynamische Zuordnung von Spark
In der folgenden Tabelle sind die Attribute für die dynamische Spark-Zuweisung aufgeführt, die Sie beim Einreichen einer Batcharbeitslast festlegen können, um die automatische Skalierung zu steuern (Spark-Attribute festlegen).
| Attribut | Beschreibung | Standard |
|---|---|---|
spark.dataproc.scaling.version |
Die Autoscaling-Version von Managed Service for Apache Spark. Geben Sie die Version 1 oder 2 an. |
1 |
spark.dynamicAllocation.enabled |
Ob die dynamische Ressourcenzuweisung verwendet werden soll, bei der die Anzahl der Executors basierend auf der Arbeitslast hoch- und herunterskaliert wird.
Wenn Sie den Wert auf false festlegen, wird das Autoscaling für die Arbeitslast deaktiviert. Standardeinstellung: true |
true |
spark.dynamicAllocation.initialExecutors |
Die anfängliche Anzahl von Executors, die der Arbeitslast zugewiesen werden. Nach dem Start der Arbeitslast kann sich die Anzahl der aktiven Executors durch Autoscaling ändern. Der Mindestwert ist 2, der Höchstwert ist 2000. |
2 |
spark.dynamicAllocation.minExecutors |
Die Mindestanzahl von Executors, auf die die Arbeitslast herunterskaliert werden soll.
Der Mindestwert beträgt 2. |
2 |
spark.dynamicAllocation.maxExecutors |
Die maximale Anzahl von Executors, auf die die Arbeitslast skaliert werden soll.
Der Höchstwert beträgt 2000. |
1000 |
spark.dynamicAllocation.executorAllocationRatio |
Passt das Hochskalieren der Spark-Arbeitslast an. Akzeptiert einen Wert von 0 bis 1. Ein Wert von 1.0 bietet maximale Skalierbarkeit und trägt zur maximalen Parallelität bei. Mit dem Wert 0.5 werden die Skalierbarkeit und Parallelität auf die Hälfte des Maximalwerts festgelegt. |
0.3 |
spark.dynamicAllocation.diagnosis.enabled |
Wenn true, werden Diagnoseinformationen protokolliert, wenn die Anzahl der ausgeführten Executors die maximale Anzahl der benötigten Executors für den Zeitraum überschreitet, der durch spark.dynamicAllocation.diagnosis.interval angegeben wird.
Die Diagnose umfasst eine Zusammenfassung des Executors mit der Anzahl der inaktiven Executors und Perzentilen für die Leerlaufzeit, die Verteilung der aktiven Aufgaben, die Größe der Shuffle-Daten und die Größe der zwischengespeicherten RDDs.
Mit spark.dynamicAllocation.diagnosis.logLevel können Sie die Logebene der Ausgabe steuern. |
false |
spark.dynamicAllocation.profile |
Legen Sie performance oder cost fest, um einen vordefinierten Satz von Konfigurationen anzuwenden, die für Leistung oder Kosteneffizienz optimiert sind.
Benutzerdefinierte Eigenschaften überschreiben die Standardeinstellungen des Profils. Weitere Informationen finden Sie unter Profile für die dynamische Zuweisung von Spark. |
none |
spark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabled |
Wenn true, wird die dynamische Zeitüberschreitungsberechnung für Executors aktiviert, die Shuffle-Daten enthalten.
Anstelle der statischen spark.dynamicAllocation.shuffleTracking.timeout wird das Zeitlimit basierend auf der Menge der auf dem Executor gespeicherten Shuffle-Daten berechnet.
So können Executors mit kleinen Shuffles schneller freigegeben werden, während Executors mit großen Shuffles länger aktiv bleiben. |
false |
spark.reducer.fetchMigratedShuffle.enabled |
Wenn diese Option auf true gesetzt ist, wird der Speicherort der Shuffle-Ausgabe vom Spark-Treiber abgerufen, nachdem ein Abruf von einem Executor fehlgeschlagen ist, der aufgrund der dynamischen Zuordnung von Spark außer Betrieb genommen wurde. Dadurch werden ExecutorDeadException-Fehler reduziert, die durch die Migration von Shuffle-Blöcken von außer Betrieb genommenen zu aktiven Executors verursacht werden, und die Anzahl der Wiederholungen von Phasen, die durch FetchFailedException-Fehler verursacht werden, wird verringert (siehe FetchFailedException caused by ExecutorDeadException). Diese Property ist in Managed Service for Apache Spark-Spark-Laufzeitversionen
1.1.12 und höher sowie 2.0.20 und höher verfügbar. |
false |
spark.scheduler.excludeShuffleSkewExecutors |
Wenn true, werden Aufgaben nicht für Executors mit Shuffle-Skewing geplant. Das sind Executors mit einer großen Menge an Shuffle-Daten oder einer großen Anzahl abgeschlossener Map-Aufgaben. Dadurch kann die Leistung verbessert werden, da Shuffle-Skewing reduziert wird. |
false |
Profile für die dynamische Zuordnung von Spark
Sie können das Attribut spark.dynamicAllocation.profile auf performance oder cost festlegen, um einen vordefinierten Satz von Spark-Konfigurationen anzuwenden, die für Leistung oder Kosteneffizienz optimiert sind. Wenn Sie Spark-Attribute zusätzlich zum Attribut spark.dynamicAllocation.profile festlegen, werden die Standardwerte des Profils für diese Attribute überschrieben.
Leistung: Dieses Profil optimiert die Ausführungszeit durch Anwenden der folgenden Standardeinstellungen:
spark.scheduler.excludeShuffleSkewExecutors:truespark.dynamicAllocation.executorIdleTimeout:300sspark.dynamicAllocation.initialExecutors:10
cost: Dieses Profil ist auf einen geringeren Ressourcenverbrauch optimiert. Dazu werden die folgenden Standardeinstellungen angewendet:
spark.dynamicAllocation.executorIdleTimeout:120sspark.dynamicAllocation.cachedExecutorIdleTimeout:120sspark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabled:truespark.dynamicAllocation.diagnosis.enabled:true
Messwerte für die dynamische Zuordnung von Spark
Für Spark-Batcharbeitslasten werden die folgenden Messwerte für die dynamische Ressourcenzuweisung von Spark generiert. Weitere Informationen zu Spark-Messwerten finden Sie unter Monitoring und Instrumentierung.
| Messwert | Beschreibung |
|---|---|
maximum-needed |
Die maximale Anzahl von Executors, die unter der aktuellen Last erforderlich sind, um alle laufenden und ausstehenden Aufgaben zu erfüllen. |
running |
Die Anzahl der laufenden Executors, die Aufgaben ausführen. |
Probleme mit der dynamischen Zuordnung von Spark und Lösungen
FetchFailedException durch ExecutorDeadException
Ursache: Wenn die dynamische Zuweisung von Spark einen Executor herunterskaliert, wird die Shuffle-Datei zu aktiven Executors migriert. Da die Spark-Reducer-Aufgabe auf einem Executor jedoch die Shuffle-Ausgabe von dem Speicherort abruft, der vom Spark-Treiber beim Start der Reducer-Aufgabe festgelegt wurde, kann es bei der Migration einer Shuffle-Datei dazu kommen, dass der Reducer weiterhin versucht, die Shuffle-Ausgabe von einem außer Betrieb genommenen Executor abzurufen. Dies führt zu
ExecutorDeadException- undFetchFailedException-Fehlern.Lösung: Aktivieren Sie das erneute Abrufen des Shuffle-Standorts, indem Sie
spark.reducer.fetchMigratedShuffle.enabledauftruefestlegen, wenn Sie Ihre Managed Service for Apache Spark-Batcharbeitslast ausführen (siehe Eigenschaften von Spark-Batcharbeitslasten festlegen). Wenn diese Eigenschaft aktiviert ist, ruft die Reducer-Aufgabe den Speicherort der Shuffle-Ausgabe noch einmal vom Treiber ab, nachdem ein Abruf von einem außer Betrieb genommenen Executor fehlgeschlagen ist.