Dynamischer Work-Ausgleich.

Mit dem dynamischen Arbeitsausgleich kann der Dienst Arbeit basierend auf den Laufzeitbedingungen dynamisch neu partitionieren. Diese Bedingungen können Folgendes umfassen:

  • Ungleichgewichte bei Work-Zuweisungen
  • Längere Verarbeitungszeiten der Worker als erwartet
  • Kürzere Verarbeitungszeiten der Worker als erwartet

Der Dataflow-Dienst erkennt diese Bedingungen automatisch und kann Arbeit nicht verwendeten oder nicht ausgelasteten Workern dynamisch zuweisen. Dadurch verringert sich die gesamte Verarbeitungszeit des Jobs.

Beschränkungen

Der dynamische Work-Ausgleich erfolgt nur, wenn der Cloud Dataflow-Dienst einige Eingabedaten parallel verarbeitet. Dies ist der Fall, wenn Daten aus einer externen Eingabequelle gelesen werden oder eine materialisierte dazwischenliegende PCollection bzw. das Ergebnis einer Aggregation wie GroupByKey verwendet wird. Wenn eine größere Anzahl von Schritten im Job zusammengeführt wird, enthält der Job weniger dazwischenliegende PCollection-Vorgänge und der dynamische Arbeitsausgleich beschränkt sich auf die Anzahl der Elemente in der materialisierten Quellsammlung PCollection. Wenn Sie gewährleisten möchten, dass der dynamische Work-Ausgleich auf eine bestimmte PCollection in der Pipeline angewendet werden kann, damit die dynamische Parallelität gewahrt bleibt, können Sie auf verschiedene Methoden zurückgreifen, um die Zusammenführung zu verhindern.

Der dynamische Arbeitsausgleich kann keine Daten neu parallelisieren, die feiner als ein einzelnes Dataset sind. Wenn einzelne Datasets in den Daten erhebliche Verzögerungen bei der Verarbeitung verursachen, kann sich die Jobausführung trotzdem verzögern. Der Grund dafür ist, dass Dataflow ein einzelnes aktives Dataset nicht auf mehrere Worker verteilen kann.

Java

Wenn Sie eine feste Anzahl von Fragmentierungen für die endgültige Ausgabe Ihrer Pipeline festlegen (z. B. durch Schreiben von Daten mit TextIO.Write.withNumShards), begrenzt Dataflow die Parallelisierung basierend auf der ausgewählten Anzahl der Fragmentierungen.

Python

Wenn Sie eine feste Anzahl von Fragmentierungen für die endgültige Ausgabe Ihrer Pipeline festlegen (z. B. durch Schreiben von Daten mit beam.io.WriteToText(..., num_shards=...)), begrenzt Dataflow die Parallelisierung basierend auf der ausgewählten Anzahl der Fragmentierungen.

Go

Wenn Sie eine feste Anzahl von Fragmentierungen für die endgültige Ausgabe Ihrer Pipeline festlegen, begrenzt Dataflow die Parallelisierung basierend auf der ausgewählten Anzahl der Fragmentierungen.

Benutzerdefinierte Datenquellen verwenden

Java

Wenn die Pipeline eine von Ihnen bereitgestellte benutzerdefinierte Datenquelle verwendet, müssen Sie die Methode splitAtFraction implementieren, damit die Quelle den dynamischen Arbeitsausgleich unterstützt.

Bei einer fehlerhaften Implementierung von splitAtFraction werden Datasets von der Quelle möglicherweise dupliziert oder verworfen. Hilfe und Tipps zur Implementierung von splitAtFraction finden Sie in der API-Referenz zu "RangeTracker".

Python

Wenn die Pipeline eine von Ihnen bereitgestellte benutzerdefinierte Datenquelle verwendet, müssen Sie für RangeTracker try_claim, try_split, position_at_fraction und fraction_consumed implementieren, damit die Quelle den dynamischen Arbeitsausgleich unterstützt.

Weitere Informationen finden Sie in der API-Referenz zu "RangeTracker".

Go

Wenn die Pipeline eine von Ihnen bereitgestellte benutzerdefinierte Datenquelle verwendet, müssen Sie eine gültige Methode RTracker implementieren, damit die Quelle den dynamischen Work-Ausgleich unterstützt.

Weitere Informationen finden Sie in den Referenzinformationen zur RTracker API.

Der dynamische Arbeitsausgleich verwendet den Rückgabewert der getProgress()-Methode Ihrer benutzerdefinierten Quelle zur Aktivierung. Die Standardimplementierung für getProgress() gibt null zurück. Achten Sie für die Aktivierung der automatischen Skalierung darauf, dass Ihre benutzerdefinierte Quelle getProgress() umgeht, um einen entsprechenden Wert zurückzugeben.