Durch horizontales Autoscaling kann Dataflow die richtige Anzahl von Worker-Instanzen für den Job auswählen und dabei Worker nach Bedarf hinzufügen oder entfernen. Dataflow skaliert anhand der durchschnittlichen CPU-Auslastung der Worker und anhand der Parallelität einer Pipeline. Die Parallelität einer Pipeline ist eine Schätzung der Anzahl der Threads, die für die effizienteste Verarbeitung von Daten zu einem bestimmten Zeitpunkt erforderlich sind.
Horizontales Autoscaling wird sowohl in Batch- als auch in Streamingpipelines unterstützt.
Batch-Autoscaling
Horizontales Autoscaling ist standardmäßig für alle Batchpipelines aktiviert. Dataflow wählt die Anzahl der Worker automatisch auf Basis der geschätzten Gesamtarbeitsmenge in jeder Phase Ihrer Pipeline aus. Diese Schätzung hängt von der Eingabegröße und dem aktuellen Durchsatz ab. Alle 30 Sekunden wertet Dataflow die Arbeitsmenge entsprechend dem Ausführungsfortschritt neu aus. Wenn der geschätzte gesamte Arbeitsaufwand zu- oder abnimmt, skaliert Dataflow die Anzahl der Worker dynamisch nach oben oder unten.
Die Anzahl der Worker ist sublinear zur Menge der Arbeit. Ein Job mit doppelt so viel Arbeit hat beispielsweise weniger als die doppelte Anzahl der Worker.
Wenn eine der folgenden Bedingungen eintritt, verwaltet oder verringert Dataflow die Anzahl der Worker entweder, um inaktive Ressourcen zu sparen:
- Die durchschnittliche CPU-Auslastung pro Worker liegt bei unter 5 %.
- Die Parallelität ist aufgrund von nicht parallelisierbarer Arbeit beschränkt, z. B. nicht aufteilbare Daten aufgrund komprimierter Dateien oder E/A-Module, die nicht aufgeteilt werden können.
- Der Grad der Parallelität ist fest, z. B. beim Schreiben in vorhandene Dateien in Cloud Storage.
Um eine Obergrenze für die Anzahl der Worker festzulegen, legen Sie die Pipelineoption --maxNumWorkers
fest.
Dieses Flag ist für Batchjobs optional. Der Standardwert ist 2,000
.
Streaming-Autoscaling
Bei Streamingjobs kann Dataflow die Anzahl der Worker bei Änderungen der Last und Ressourcennutzung anpassen.
Horizontales Autoscaling ist für Streamingjobs, die Streaming Engine verwenden, standardmäßig aktiviert. Wenn Sie horizontales Autoscaling für Streamingjobs ohne Streaming Engine aktivieren möchten, legen Sie die folgenden Pipelineoptionen beim Start der Pipeline fest:
Java
--autoscalingAlgorithm=THROUGHPUT_BASED
--maxNumWorkers=MAX_WORKERS
Ersetzen Sie MAX_WORKERS durch die maximale Anzahl von Worker-Instanzen.
Python
--autoscaling_algorithm=THROUGHPUT_BASED
--max_num_workers=MAX_WORKERS
Ersetzen Sie MAX_WORKERS durch die maximale Anzahl von Worker-Instanzen.
Go
--autoscaling_algorithm=THROUGHPUT_BASED
--max_num_workers=MAX_WORKERS
Ersetzen Sie MAX_WORKERS durch die maximale Anzahl von Worker-Instanzen.
Horizontales Autoscaling deaktivieren
Legen Sie beim Ausführen des Jobs die folgende Pipelineoption fest, um das horizontale Autoscaling zu deaktivieren.
Java
--autoscalingAlgorithm=NONE
Wenn Sie das horizontale Autoscaling deaktivieren, legt Dataflow die Anzahl der Worker entsprechend der Option --numWorkers
fest.
Python
--autoscaling_algorithm=NONE
Wenn Sie das horizontale Autoscaling deaktivieren, legt Dataflow die Anzahl der Worker entsprechend der Option --num_workers
fest.
Go
--autoscaling_algorithm=NONE
Wenn Sie das horizontale Autoscaling deaktivieren, legt Dataflow die Anzahl der Worker entsprechend der Option --num_workers
fest.
Benutzerdefinierte Quellen.
Beim Erstellen einer benutzerdefinierten Datenquelle können Sie die Leistung potenziell verbessern, indem Sie Methoden implementieren, die weitere Informationen zum Algorithmus für horizontales Autoscaling bereitstellen:
Java
Begrenzte Quellen
- Implementieren Sie in der Unterklasse
BoundedSource
die MethodegetEstimatedSizeBytes
. Der Dataflow-Dienst berechnet mithilfe vongetEstimatedSizeBytes
die Anzahl von Workern, die am Anfang für die Pipeline verwendet werden soll. - Implementieren Sie in der Unterklasse
BoundedReader
die MethodegetFractionConsumed
. Der Dataflow-Dienst verfolgt mithilfe vongetFractionConsumed
den Lesefortschritt und ermittelt die richtige Anzahl von Workern, die während eines Lesevorgangs verwendet werden soll.
Unbegrenzte Quellen
Die Quelle muss den Dataflow-Dienst über Rückstände informieren.
Der Rückstand ist eine Schätzung der Eingaben in Byte, die noch nicht durch die Quelle verarbeitet wurden. Damit der Dienst über Rückstände informiert wird, müssen Sie in Ihrer UnboundedReader
-Klasse eine der folgenden Methoden einbinden:
getSplitBacklogBytes()
: Rückstand für die aktuelle Teilung der Quelle; der Dienst aggregiert den Rückstand für alle Teilungen.getTotalBacklogBytes()
: Der globale Rückstand für alle Teilungen; in einigen Fällen ist der Rückstand nicht für jede Teilung verfügbar und kann nur für alle Teilungen berechnet werden. Nur die erste Teilung (Teilungs-ID "0") muss den Gesamtrückstand bereitstellen.
Das Apache Beam-Repository enthält mehrere Beispiele für benutzerdefinierte Quellen, die die Klasse UnboundedReader
implementieren.
Python
Begrenzte Quellen
- Implementieren Sie in der Unterklasse
BoundedSource
die Methodeestimate_size
. Der Dataflow-Dienst berechnet mithilfe vonestimate_size
die Anzahl von Workern, die am Anfang für die Pipeline verwendet werden soll. - Implementieren Sie in der Unterklasse
RangeTracker
die Methodefraction_consumed
. Der Dataflow-Dienst verfolgt mithilfe vonfraction_consumed
den Lesefortschritt und ermittelt die richtige Anzahl von Workern, die während eines Lesevorgangs verwendet werden soll.
Go
Begrenzte Quellen
- Implementieren Sie in Ihrem
RangeTracker
die MethodeGetProgress()
. Der Dataflow-Dienst verfolgt mithilfe vonGetProgress
den Lesefortschritt und ermittelt die richtige Anzahl von Workern, die während eines Lesevorgangs verwendet werden soll.
Beschränkungen
- Bei Jobs, die Dataflow Prime ausführen, wird das horizontale Autoscaling während und bis zu 10 Minuten nach dem vertikalen Autoscaling deaktiviert. Weitere Informationen finden Sie unter Auswirkungen auf horizontales Autoscaling.
- Für Pipelines, die Dataflow Shuffle nicht verwenden, ist Dataflow möglicherweise nicht in der Lage, die Worker effektiv herunterzuskalieren, da diese möglicherweise Shuffle-Daten auf lokalen Laufwerken gespeichert haben.
- Die PeriodicImpulse-Transformation wird beim Streaming-Autoscaling nicht unterstützt. Wenn Ihre Pipeline
PeriodicImpulse
verwendet, werden Dataflow-Worker nicht wie erwartet herunterskaliert.
Nächste Schritte
- Horizontales Autoscaling für Streamingpipelines optimieren
- Dataflow-Autoscaling überwachen
- Fehlerbehebung bei Dataflow-Autoscaling