Horizontales Autoscaling

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 Methode getEstimatedSizeBytes. Der Dataflow-Dienst berechnet mithilfe von getEstimatedSizeBytes die Anzahl von Workern, die am Anfang für die Pipeline verwendet werden soll.
  • Implementieren Sie in der Unterklasse BoundedReader die Methode getFractionConsumed. Der Dataflow-Dienst verfolgt mithilfe von getFractionConsumed 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 Methode estimate_size. Der Dataflow-Dienst berechnet mithilfe von estimate_size die Anzahl von Workern, die am Anfang für die Pipeline verwendet werden soll.
  • Implementieren Sie in der Unterklasse RangeTracker die Methode fraction_consumed. Der Dataflow-Dienst verfolgt mithilfe von fraction_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 Methode GetProgress(). Der Dataflow-Dienst verfolgt mithilfe von GetProgress 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