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 die 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 von Managed Service for Apache Spark V2
Mit dem Autoscaling von Managed Service for Apache Spark Version 2 (V2) werden der Standardversion 1 (V1) Funktionen und Verbesserungen hinzugefügt, mit denen Sie Arbeitslasten von Managed Service for Apache Spark verwalten, die Arbeitslastleistung verbessern und Kosten sparen können:
- Asynchrone Knotenskalierung nach unten: Beim Autoscaling V2 wird die synchrone Skalierung nach unten von V1 durch eine asynchrone Skalierung nach unten ersetzt. Bei der asynchronen Skalierung nach unten skaliert Managed Service for Apache Spark die Arbeitslastressourcen nach unten, ohne darauf zu warten, dass alle Knoten die Shuffle-Migration abgeschlossen haben. Das bedeutet, dass Knoten mit langer Ausführungszeit, die langsam skaliert werden, die Skalierung nach oben nicht blockieren.
- Intelligente Knotenauswahl für die Skalierung nach unten: Beim Autoscaling V2 wird die zufällige Knotenauswahl von V1 durch einen intelligenten Algorithmus ersetzt, der die besten Knoten für die Skalierung nach unten zuerst identifiziert. Dieser Algorithmus berücksichtigt Faktoren wie die Größe der Shuffle-Daten des Knotens und die Leerlaufzeit.
- Konfigurierbares Verhalten bei der ordnungsgemäßen Außerbetriebnahme von Spark und der Shuffle-Migration: Mit dem Autoscaling V2 können Sie Standard-Spark-Attribute verwenden, um die ordnungsgemäße Außerbetriebnahme von Spark und die Shuffle-Migration zu konfigurieren. Mit dieser Funktion können Sie die Migrationskompatibilität mit Ihren benutzerdefinierten Spark-Attributen aufrechterhalten.
Funktionen des Autoscalings von Managed Service for Apache Spark
| Funktion | Autoscaling von Managed Service for Apache Spark V1 | Autoscaling von Managed Service for Apache Spark V2 |
| Knotenskalierung nach unten | Synchron | Asynchron |
| Knotenauswahl für die Skalierung nach unten | Zufällig | Intelligent |
| Ordnungsgemäße Außerbetriebnahme von Spark und Shuffle-Migration | Nicht konfigurierbar | Konfigurierbar |
Attribute für die dynamische Zuordnung von Spark
In der folgenden Tabelle sind die Attribute für die dynamische Zuordnung von Spark aufgeführt, die Sie beim Senden einer Batcharbeitslast festlegen können, um das Autoscaling zu steuern. Informationen zum Festlegen von Spark-Attributen
| Attribut | Beschreibung | Standard |
|---|---|---|
spark.dataproc.scaling.version |
Die Version des Autoscalings von Managed Service for Apache Spark. Geben Sie
Version 1 oder 2 an. |
1 |
spark.dynamicAllocation.enabled |
Gibt an, ob die dynamische Ressourcenzuweisung verwendet werden soll, mit der die Anzahl der Executors basierend auf der Arbeitslast nach oben und unten skaliert wird.
Wenn Sie den Wert auf false setzen, wird das Autoscaling
für die Arbeitslast deaktiviert. Standard: true. |
true |
spark.dynamicAllocation.initialExecutors |
Die anfängliche Anzahl der Executors, die der Arbeitslast zugewiesen wurden. Nach dem
Arbeitslast startet, kann die Anzahl der aktiven Executors durch das Autoscaling geändert werden.
Der Mindestwert ist 2, der Höchstwert 2000. |
2 |
spark.dynamicAllocation.minExecutors |
Die Mindestanzahl der Executors, auf die die Arbeitslast skaliert werden soll.
Der Mindestwert ist 2. |
2 |
spark.dynamicAllocation.maxExecutors |
Die maximale Anzahl der Executors, auf die die Arbeitslast skaliert werden soll.
Der Höchstwert ist 2000. |
1000 |
spark.dynamicAllocation.executorAllocationRatio |
Passt die Skalierung der Spark-Arbeitslast nach oben an. Akzeptiert einen Wert von
0 bis 1. Ein Wert von 1.0
bietet die maximale Skalierbarkeit nach oben und trägt dazu bei, die maximale
Parallelität zu erreichen. Ein Wert von 0.5 legt die Skalierbarkeit nach oben und
die Parallelität auf die Hälfte des Höchstwerts fest. |
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 enthält eine Zusammenfassung der Executors mit der Anzahl der Executors im Leerlauf und den Perzentilen der Leerlaufzeit
der Verteilung der aktiven Aufgaben, der Größe der Shuffle-Daten und der Größe der zwischengespeicherten RDD.
Mit spark.dynamicAllocation.diagnosis.logLevel können Sie die Protokollebene der Ausgabe steuern. |
false |
spark.dynamicAllocation.profile |
Legen Sie performance oder cost fest, um eine vordefinierte Reihe von
Konfigurationen anzuwenden, die für Leistung oder Kosteneffizienz optimiert sind.
Benutzerdefinierte Attribute überschreiben die Standardeinstellungen des Profils. Weitere Informationen finden Sie unter
Profile für die dynamische Zuordnung 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 die Zeitüberschreitung basierend auf der Menge der Shuffle-Daten berechnet, die auf dem Executor gespeichert sind.
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 auf true gesetzt, wird das Abrufen des Speicherorts der Shuffle-Ausgabe vom Spark-Treiber aktiviert, 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 Executors zu aktiven Executors verursacht werden, und die Anzahl der Wiederholungen von Phasen wird reduziert,
die durch FetchFailedException
Fehler verursacht werden (siehe
FetchFailedException caused by
ExecutorDeadException).
Dieses Attribut ist in den Spark-Laufzeitversionen
Spark runtime
versions
1.1.12 und höher sowie 2.0.20 und höher von Managed Service for Apache Spark verfügbar. |
false |
spark.scheduler.excludeShuffleSkewExecutors |
Wenn true, werden Aufgaben nicht auf Executors mit Shuffle-Skew geplant. Das sind Executors, die eine große Menge an Shuffle-Daten oder eine große Anzahl abgeschlossener Map-Aufgaben haben. Dadurch kann die Leistung verbessert werden, indem Shuffle-Skew reduziert wird. |
false |
Profile für die dynamische Zuordnung von Spark
Sie können das Attribut spark.dynamicAllocation.profile auf performance oder cost setzen, um eine vordefinierte Reihe von Spark-Konfigurationen anzuwenden, die für Leistung oder Kosteneffizienz optimiert sind. Wenn Sie zusätzlich zum Festlegen des Attributs spark.dynamicAllocation.profile Spark-Attribute festlegen, überschreiben Ihre Einstellungen die Standardeinstellungen des Profils für diese Attribute.
performance: Dieses Profil ist für eine minimale Ausführungszeit optimiert, indem die folgenden Standardeinstellungen angewendet werden:
spark.scheduler.excludeShuffleSkewExecutors:truespark.dynamicAllocation.executorIdleTimeout:300sspark.dynamicAllocation.initialExecutors:10
cost: Dieses Profil ist für einen reduzierten Ressourcenverbrauch optimiert, indem die folgenden Standardeinstellungen angewendet werden:
spark.dynamicAllocation.executorIdleTimeout:120sspark.dynamicAllocation.cachedExecutorIdleTimeout:120sspark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabled:truespark.dynamicAllocation.diagnosis.enabled:true
Messwerte für die dynamische Zuordnung von Spark
Spark-Batcharbeitslasten generieren die folgenden Messwerte im Zusammenhang mit der dynamischen Ressourcenzuweisung von Spark. Weitere Informationen zu Spark-Messwerten finden Sie unter Monitoring und Instrumentierung.
| Messwert | Beschreibung |
|---|---|
maximum-needed |
Die maximale Anzahl der Executors, die unter der aktuellen Last erforderlich sind, um alle laufenden und ausstehenden Aufgaben zu erfüllen. |
running |
Die Anzahl der Executors, die Aufgaben ausführen. |
Probleme und Lösungen für die dynamische Zuordnung von Spark
FetchFailedException caused by ExecutorDeadException
Ursache: Wenn die dynamische Zuordnung 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 vom Speicherort abruft, der vom Spark-Treiber festgelegt wurde, als die Reducer-Aufgabe gestartet wurde, kann der Reducer bei der Migration einer Shuffle-Datei weiterhin versuchen, 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-Speicherorts, indem Sie das
spark.reducer.fetchMigratedShuffle.enabledauftruesetzen, wenn Sie Ihre Managed Service for Apache Spark-Batcharbeitslast ausführen (siehe Attribute für Spark-Batcharbeitslasten festlegen). Wenn dieses Attribut aktiviert ist, ruft die Reducer-Aufgabe den Speicherort der Shuffle-Ausgabe nach einem fehlgeschlagenen Abruf von einem außer Betrieb genommenen Executor erneut vom Treiber ab.