Horizontales Autoscaling

Durch horizontales Autoscaling kann Dataflow die entsprechende Anzahl von Worker-Instanzen für Ihren Job auswählen und nach Bedarf Worker hinzufügen oder entfernen. Dataflow skaliert auf der Grundlage der durchschnittlichen CPU-Auslastung der Worker und auf 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 anhand 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 des Ausführungsfortschritts 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, behält Dataflow die Anzahl der Worker entweder bei oder verringert sie, 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, die durch komprimierte Dateien verursacht werden, oder E/A-Module, die nicht aufgeteilt werden können.
  • Der Grad der Parallelität ist unveränderlich, z. B. beim Schreiben in vorhandene Dateien in Cloud Storage.

Wenn Sie eine Obergrenze für die Anzahl der Worker festlegen möchten, legen Sie die Pipelineoption --maxNumWorkers fest. Dieses Flag ist für Batchjobs optional. Der Standardwert ist 1000.

Streaming-Autoscaling

Bei Streamingjobs kann Dataflow durch horizontales Autoscaling die Anzahl der Worker bei Änderungen der Last und Ressourcennutzung anpassen.

Horizontales Autoscaling ist standardmäßig für Streamingjobs aktiviert, die Streaming Engine verwenden. Legen Sie beim Start der Pipeline die folgenden Pipelineoptionen fest, um horizontales Autoscaling für Streamingjobs ohne Streaming Engine zu aktivieren:

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.

Einfach loslegen (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.

Einfach loslegen (Go)

--autoscaling_algorithm=NONE

Wenn Sie das horizontale Autoscaling deaktivieren, legt Dataflow die Anzahl der Worker entsprechend der Option --num_workers fest.

Benutzerdefinierte Quellen.

Wenn Sie eine benutzerdefinierte Datenquelle erstellen, 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.

Einfach loslegen (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 zehn 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 Transformation PeriodicImpulse wird beim Streaming-Autoscaling nicht unterstützt. Wenn Ihre Pipeline PeriodicImpulse verwendet, werden Dataflow-Worker nicht wie erwartet herunterskaliert.

Nächste Schritte