Auf dieser Seite erfahren Sie, wie Sie Probleme mit den Autoscaling-Features von Dataflow beheben. Außerdem erfahren Sie, wie Sie das Autoscaling verwalten.
Job wird nicht hoch- oder herunterskaliert
Dieser Abschnitt enthält Informationen zu Szenarien, die möglicherweise ein Hoch- oder Herunterskalieren von Workern verhindern.
Streamingjob wird nicht hochskaliert
Wenn Ihre Streamingpipeline einen Rückstand hat, werden die Worker nicht vertikal skaliert.
Dieses Problem tritt auf, wenn der Rückstand weniger als einige Minuten beträgt oder wenn die Worker weniger als 20 % ihrer CPUs verwenden.
Manchmal ist der Rückstand erhöht, die CPU-Auslastung ist jedoch gering. Da einige Aufgaben keine hohe CPU-Auslastung erfordern, wird durch das Hinzufügen von Workern die Leistung nicht verbessert. In diesen Fällen skaliert Dataflow nicht. Weitere Informationen finden Sie unter Streaming-Autoscaling. Dieses Szenario kann folgende Gründe haben:
- Die Pipeline ist E/A-intensiv.
- Die Pipeline wartet auf externe RPC-Aufrufe.
- Heiße Schlüssel verursachen eine ungleichmäßige CPU-Auslastung durch Worker.
- Die Pipeline hat nicht genügend Schlüssel.
Batch- und Streamingjobs skalieren nicht hoch
Der Batch- oder Streamingjob wird wie erwartet ausgeführt. Wenn jedoch mehr Worker benötigt werden, wird der Job nicht hochskaliert.
Dieses Problem kann folgende Ursachen haben:
- Auf die Staging- oder temporären Dateien kann nicht zugegriffen werden. Wenn Ihr Job einen Cloud Storage-Bucket verwendet, verfügt der Bucket möglicherweise über eine Lebenszykluskonfiguration, die Objekte im Bucket löscht. Zu den gelöschten Objekten gehören Staging- und temporäre Ordner und Dateien. Prüfen Sie in der Lebenszykluskonfiguration für den Bucket, ob Dateien gelöscht wurden. Wenn die Staging- oder temporären Ordner oder Dateien nach dem Start des Jobs gelöscht wurden, sind die zum Erstellen neuer Worker erforderlichen Pakete möglicherweise nicht vorhanden. Erstellen Sie die Ordner und Dateien im Bucket neu, um dieses Problem zu beheben.
- Firewallregeln verhindern, dass Worker Traffic an die erforderlichen TCP-Ports senden und empfangen. Firewallregeln können verhindern, dass Worker gestartet werden. Dataflow-Worker müssen Traffic über die TCP-Ports 12345 und 12346 senden und empfangen können. Weitere Informationen, einschließlich der Schritte zur Behebung dieses Problems, finden Sie unter Firewallregeln für Dataflow.
- Eine benutzerdefinierte Quelle hat eine
getProgress()
-Methode, die einen NULL-Wert zurückgibt. Wenn Sie eine benutzerdefinierte Quelle verwenden, basieren die Rückstandmesswerte auf dem Rückgabewert dergetProgress()
-Methode Ihrer benutzerdefinierten Quelle, um mit der Datenerfassung zu beginnen. Die Standardimplementierung fürgetProgress()
gibt einen NULL-Wert zurück. Achten Sie zur Behebung dieses Problems darauf, dass Ihre benutzerdefinierte Quelle die StandardmethodegetProgress()
überschreibt, um einen Nicht-NULL-Wert zurückzugeben. - Ein durch vertikales Autoscaling ausgelöstes Update deaktiviert das horizontale Autoscaling vorübergehend. Weitere Informationen finden Sie unter Auswirkungen auf horizontales Autoscaling.
- Wenn Sie einen
map
-Vorgang in einer Python-Pipeline ausführen und Ihr Job nicht hochskaliert wird, müssen Sie möglicherweise eineReshuffle
-Transformation in Ihren Pipelinecode einfügen. Weitere Informationen finden Sie in der Apache Beam-Dokumentation unter Reshuffle.
Streamingjob wird nicht herunterskaliert
Wenn Ihr Streamingjob einen geringen Rückstand und eine niedrige CPU-Auslastung hat, werden die Worker nicht herunterskaliert. Dieses Problem kann verschiedene Ursachen haben.
Wenn Jobs keine Streaming Engine verwenden, gleicht Dataflow die Anzahl der nichtflüchtigen Speicher zwischen den Workern aus. Daher muss jeder Worker die gleiche Anzahl an nichtflüchtigen Speichern haben. Wenn es beispielsweise 100 Laufwerke und 100 Worker gibt, hat jeder Worker ein Laufwerk. Wenn der Job herunterskaliert wird, kann der Job 50 Worker mit zwei nichtflüchtigen Speichern pro Worker haben. Der Job wird erst wieder herunterskaliert, wenn er 25 Worker mit vier nichtflüchtigen Speichern pro Worker haben kann. Darüber hinaus ist die Mindestanzahl von Workern der Wert, der
maxNumWorkers
zugewiesen ist, geteilt durch 15. Weitere Informationen finden Sie unter Skalierungsbereich für Streaming-Autoscaling-Pipelines.Wenn Jobs Streaming Engine verwenden, basiert das Herunterskalieren auf einer CPU-Zielauslastung von 75 %. Wenn diese CPU-Auslastung nicht erreicht werden kann, ist das Herunterskalieren deaktiviert.
Die Schätzung des Rückstands muss mindestens zwei Sekunden lang mindestens zwei Minuten dauern, bevor die Worker herunterskaliert werden. Durch Schwankungen des Rückstands kann das Herunterskalieren deaktiviert werden. Darüber hinaus kann ein niedriger Durchsatz die Zeitschätzung verzerren.
PeriodicImpulse
wird in den Apache Beam SDK-Versionen 2.60.0 und höher unterstützt. Wenn Ihre PipelinePeriodicImpulse
mit den Apache Beam SDK-Versionen 2.59.0 und niedriger verwendet, werden Dataflow-Worker nicht wie erwartet herunterskaliert.
Hochskalierungen
Der Batch- oder Streamingjob beginnt mit der Hochskalierung, die Worker beenden jedoch die Skalierung, obwohl ein Rückstand bleibt.
Dieses Problem tritt auf, wenn Kontingentlimits erreicht werden.
- Compute Engine-Kontingente: Dataflow-Jobs unterliegen dem Compute Engine-Kontingent des Projekts. Wenn mehrere Jobs ausgeführt werden, überschreitet das Projekt möglicherweise das Limit seines Compute Engine-Kontingents. In diesem Fall kann Dataflow die Anzahl der Worker nicht erhöhen.
- CPU-Kontingente: Dataflow-Jobs unterliegen auch dem CPU-Kontingent des Projekts. Wenn der Worker-Typ mehr als eine CPU verwendet, liegt das Projekt möglicherweise am Limit des CPU-Kontingents.
- Kontingente für externe IP-Adressen: Wenn Ihr Job externe IP-Adressen für die Kommunikation mit Ressourcen verwendet, benötigen Sie so viele externe IP-Adressen wie Worker. Wenn die Anzahl der Worker vertikal skaliert wird, erhöht sich auch die Anzahl der externen IP-Adressen. Wenn das IP-Adresslimit erreicht ist, beenden die Worker das Hochskalieren.
Wenn die von Ihnen ausgewählte Region aus einer Ressource stammt, können Sie keine neuen Ressourcen dieses Typs erstellen, auch wenn in Ihrer Region oder Ihrem Projekt noch ein Kontingent vorhanden ist. Beispiel: Ihr Kontingent zum Erstellen externer IP-Adressen in us-central1
ist noch nicht aufgebraucht, aber in dieser Region sind keine IP-Adressen verfügbar. Weitere Informationen finden Sie unter Kontingente und Ressourcenverfügbarkeit.
Fordern Sie eine Kontingenterhöhung an oder führen Sie den Job in einer anderen Region aus, um dieses Problem zu beheben.
Der Hinweis zur Worker-Auslastung hat keine Auswirkungen
Sie legen den Hinweis zur Auslastung von Arbeitsthreads fest, das Autoscaling-Verhalten ändert sich jedoch nicht.
Rufen Sie das Diagramm CPU-Auslastung der Worker auf und prüfen Sie, ob der Hinweis zur Worker-Auslastung aktiv verwendet wird. Wenn der Hinweis verwendet wird, wird im Diagramm CPU utilization hint (actively used by autoscaler)
angezeigt. Andernfalls wird CPU utilization hint (not actively used by autoscaler)
angezeigt.
Der Auslastungshinweis ist nur einer der Faktoren, die sich auf das Autoscaling auswirken. In der folgenden Tabelle sind einige Gründe dafür aufgeführt, warum der Autoscaler den Hinweis möglicherweise nicht aktiv verwendet:
Beobachtetes Skalierungsverhalten | Ursachen | Zu prüfende Messwerte |
---|---|---|
Keine Änderung |
|
|
Hochskalieren |
|
|
Herunterskalieren |
|
Weitere Informationen finden Sie unter Streaming-Autoscaling-Heuristik.
Lücken in Autoscaling-Messwerten
Es gibt kurze, vorübergehende Lücken bei den Autoscaling-Messwerten.
Dieses Problem kann auftreten, wenn Backend-Aufgaben neu gestartet werden. Diese Lücken in den Messwerten weisen nicht auf ein Problem mit dem Autoscaling oder der Zuverlässigkeit des Streamingjobs hin.
CPU ist ungleichmäßig verteilt
Beim Autoscaling des Jobs wird die CPU-Auslastung ungleichmäßig auf die Worker verteilt. Einige Worker haben eine höhere CPU-Auslastung, Systemlatenz oder Datenaktualität als andere.
Dieses Problem kann auftreten, wenn Ihre Daten einen "heißen" Schlüssel enthalten. Ein „heißer” Schlüssel ist ein Schlüssel mit so vielen Elementen, dass es sich negativ auf die Pipeline-Leistung auswirkt. Jeder Schlüssel muss von einem einzelnen Worker verarbeitet werden, sodass die Arbeit nicht auf Worker aufgeteilt werden kann.
Weitere Informationen finden Sie in den Hinweisen zu fehlerhaften „heißen” Schlüsseln.
Das Arbeitselement, das den Zustand anfordert, ist im Backend nicht mehr gültig.
Während der Kommunikation zwischen Worker-VM-Instanzen und Streaming Engine-Aufgaben in einer Streaming-Pipeline tritt der folgende Fehler auf:
The work item requesting state read is no longer valid on the backend.
The work has already completed or will be retried.
This is expected during autoscaling events.
Während des Autoscalings kommunizieren Worker-VM-Instanzen mit mehreren Streaming Engine-Aufgaben und jede Aufgabe stellt mehrere Worker-VM-Instanzen bereit. Elementschlüssel werden zur Verteilung der Arbeit verwendet. Jede Aufgabe und Worker-VM-Instanz hat eine Sammlung von Schlüsselbereichen und die Verteilung dieser Bereiche kann sich dynamisch ändern. Während der automatischen Skalierung kann beispielsweise die Größenanpassung des Jobs dazu führen, dass sich die Verteilung des Schlüsselbereichs ändert. Wenn sich ein Schlüsselbereich ändert, kann dieser Fehler auftreten. Der Fehler wird erwartet. Wenn Sie keine Korrelation zwischen diesen Nachrichten und einer leistungsschwachen Pipeline feststellen, können Sie sie ignorieren.
Unzureichende Streaming Engine-Ressourcen
Wenn die Streaming Engine die von Ihnen angeforderte Mindestanzahl von Workern nicht zuweisen kann, wird der folgende Fehler zurückgegeben:
Streaming Engine does not currently have enough resources available to fulfill
the request.
Legen Sie eine kleinere Mindestanzahl von Workern fest, um dieses Problem zu beheben. Weitere Informationen finden Sie unter Autoscaling-Bereich festlegen.
Skalierungsbereich für Streaming-Autoscaling-Pipelines
Dieser Abschnitt enthält Details zum Skalierungsbereich für Streaming-Autoscaling-Pipelines.
Java
Bei Streaming-Autoscaling-Jobs, die nicht Streaming Engine verwenden, werden jedem Worker vom Dataflow-Dienst 1 bis 15 nichtflüchtige Speicher zugeordnet. Die Mindestanzahl der Worker, die für eine Streaming-Autoscaling-Pipeline verwendet werden, ist also N/15, wobei N der Wert von --maxNumWorkers
ist.
Für Streaming-Autoscaling-Jobs, die Streaming Engine verwenden, ist die Mindestanzahl von Workern 1.
Dataflow gleicht die Anzahl der nichtflüchtigen Speicher zwischen den Workern aus. Wenn die Pipeline beispielsweise im stabilen Zustand drei oder vier Worker benötigt, können Sie --maxNumWorkers=15
festlegen. Die Pipeline führt in diesem Fall automatisch eine Skalierung zwischen 1 und 15 Workern durch. Dabei werden 1, 2, 3, 4, 5, 8 oder 15 Worker verwendet, die jeweils 15, 8, 5, 4, 3, 2 oder 1 nichtflüchtige(n) Speicher pro Worker entsprechen.
--maxNumWorkers
kann maximal 1000 sein.
Python
Bei Streaming-Autoscaling-Jobs, die nicht Streaming Engine verwenden, werden jedem Worker vom Dataflow-Dienst 1 bis 15 nichtflüchtige Speicher zugeordnet. Die Mindestanzahl der Worker, die für eine Streaming-Autoscaling-Pipeline verwendet werden, ist also N/15, wobei N der Wert von --max_num_workers
ist.
Für Streaming-Autoscaling-Jobs, die Streaming Engine verwenden, ist die Mindestanzahl von Workern 1.
Dataflow gleicht die Anzahl der nichtflüchtigen Speicher zwischen den Workern aus. Wenn die Pipeline beispielsweise im stabilen Zustand drei oder vier Worker benötigt, können Sie --max_num_workers=15
festlegen. Die Pipeline führt in diesem Fall automatisch eine Skalierung zwischen 1 und 15 Workern durch. Dabei werden 1, 2, 3, 4, 5, 8 oder 15 Worker verwendet, die jeweils 15, 8, 5, 4, 3, 2 oder 1 nichtflüchtige(n) Speicher pro Worker entsprechen.
--max_num_workers
kann maximal 1000 sein.
Go
Bei Streaming-Autoscaling-Jobs, die nicht Streaming Engine verwenden, werden jedem Worker vom Dataflow-Dienst 1 bis 15 nichtflüchtige Speicher zugeordnet. Die Mindestanzahl der Worker, die für eine Streaming-Autoscaling-Pipeline verwendet werden, ist also N/15, wobei N der Wert von --max_num_workers
ist.
Für Streaming-Autoscaling-Jobs, die Streaming Engine verwenden, ist die Mindestanzahl von Workern 1.
Dataflow gleicht die Anzahl der nichtflüchtigen Speicher zwischen den Workern aus. Wenn die Pipeline beispielsweise im stabilen Zustand drei oder vier Worker benötigt, können Sie --max_num_workers=15
festlegen. Die Pipeline führt in diesem Fall automatisch eine Skalierung zwischen 1 und 15 Workern durch. Dabei werden 1, 2, 3, 4, 5, 8 oder 15 Worker verwendet, die jeweils 15, 8, 5, 4, 3, 2 oder 1 nichtflüchtige(n) Speicher pro Worker entsprechen.
--max_num_workers
kann maximal 1000 sein.
Maximale Anzahl der Worker, die Autoscaling für Streaming verwenden können
Java
Die Ausführung von Dataflow wird durch das Compute Engine-Kontingent für die Instanzanzahl für Ihr Projekt oder durch maxNumWorkers
begrenzt, je nachdem, welcher Wert geringer ist.
Python
Die Ausführung von Dataflow wird durch das Compute Engine-Kontingent für die Instanzanzahl für Ihr Projekt oder durch max_num_workers
begrenzt, je nachdem, welcher Wert geringer ist.
Go
Die Ausführung von Dataflow wird durch das Compute Engine-Kontingent für die Instanzanzahl für Ihr Projekt oder durch max_num_workers
begrenzt, je nachdem, welcher Wert geringer ist.
Autoscaling begrenzen, um die Auswirkungen auf die Abrechnung zu reduzieren
Wenn Sie nicht möchten, dass das Autoscaling Ihre Rechnung erhöht, können Sie die maximale Anzahl der Worker begrenzen, die der Streamingjob verwenden kann.
Java
Indem Sie --maxNumWorkers
festlegen, begrenzen Sie den Skalierungsbereich, der zur Verarbeitung Ihres Jobs verwendet wird.
Python
Indem Sie --max_num_workers
festlegen, begrenzen Sie den Skalierungsbereich, der zur Verarbeitung Ihres Jobs verwendet wird.
Go
Indem Sie --max_num_workers
festlegen, begrenzen Sie den Skalierungsbereich, der zur Verarbeitung Ihres Jobs verwendet wird.
Skalierungsbereich ändern
Informationen zum Ändern des Skalierungsbereichs einer Streamingpipeline finden Sie unter Autoscaling-Bereich festlegen.
Autoscaling für Streamingpipelines deaktivieren
Führen Sie die folgenden Schritte aus, um Autoscaling in der Streamingpipeline zu deaktivieren.
Java
Legen Sie dazu --autoscalingAlgorithm=NONE
fest. Weitere Informationen finden Sie unter Horizontales Autoscaling deaktivieren.
Python
Legen Sie dazu --autoscaling_algorithm=NONE
fest. Weitere Informationen finden Sie unter Horizontales Autoscaling deaktivieren.
Go
Legen Sie dazu --autoscaling_algorithm=NONE
fest. Weitere Informationen finden Sie unter Horizontales Autoscaling deaktivieren.
Feste Anzahl von Workern verwenden
Bei Streamingjobs ohne Streaming Engine wird standardmäßig eine feste Anzahl von Workern verwendet. Wenn Sie Streaming-Autoscaling mit diesen Pipelines verwenden möchten, müssen Sie es explizit aktivieren, da es standardmäßig nicht aktiviert ist.