Auf dieser Seite wird beschrieben, wie Sie Fehler aufgrund fehlenden Speichers in Dataflow ermitteln und beheben.
Speichermangelfehler finden
Verwenden Sie eine der folgenden Methoden, um festzustellen, ob Ihrer Pipeline der Speicher ausgeht.
- Rufen Sie auf der Seite Jobdetails im Bereich Logs den Tab Diagnose auf. Auf diesem Tab werden Fehler im Zusammenhang mit Speicherproblemen und die Häufigkeit des Auftretens dieser Fehler angezeigt.
- Verwenden Sie in der Dataflow-Monitoring-Oberfläche das Diagramm Speicherauslastung, um die Kapazität und Nutzung des Workers zu überwachen.
- Wählen Sie auf der Seite Jobdetails im Bereich Logs die Option Worker-Logs aus, um in den Worker-Logs nach Arbeitsspeicherfehlern zu suchen.
Fehler aufgrund von fehlendem Speicherplatz können auch in Systemprotokollen angezeigt werden. Rufen Sie den Log-Explorer auf und verwenden Sie die folgende Abfrage, um diese Logs aufzurufen:
resource.type="dataflow_step" resource.labels.job_id="JOB_ID" "out of memory" OR "OutOfMemory" OR "Shutting down JVM"
Ersetzen Sie JOB_ID durch die ID Ihrer Jobs.
Für Java-Jobs meldet der Java-Speichermonitor regelmäßig Messwerte für die automatische Speicherbereinigung. Wenn der Anteil der CPU-Zeit, der für die automatische Speicherbereinigung genutzt wird, einen Grenzwert von 50% über einen längeren Zeitraum hinweg überschreitet, schlägt das SDK-Nutzung fehl. Möglicherweise wird ein Fehler wie im folgenden Beispiel angezeigt:
Shutting down JVM after 8 consecutive periods of measured GC thrashing. Memory is used/total/max = ...
Dieser Fehler kann auftreten, wenn der physische Speicher noch verfügbar ist. Er deutet in der Regel darauf hin, dass die Speichernutzung der Pipeline ineffizient ist. Optimieren Sie Ihre Pipeline, um dieses Problem zu beheben.
Der Java-Speichermonitor wird über die
MemoryMonitorOptions
-Schnittstelle konfiguriert.
Wenn Ihr Job eine hohe Speichernutzung oder Fehler aufgrund fehlenden Speichers hat, folgen Sie den Empfehlungen auf dieser Seite, um die Speichernutzung zu optimieren oder die verfügbare Speichermenge zu erhöhen.
Nicht genügend Arbeitsspeicherfehler beheben
Änderungen an der Dataflow-Pipeline können Probleme mit fehlendem Arbeitsspeicher auflösen oder die Arbeitsspeichernutzung reduzieren. Mögliche Änderungen beinhalten die folgenden Aktionen:
- Pipeline optimieren
- Anzahl der Threads reduzieren
- Maschinentyp mit mehr Arbeitsspeicher pro vCPU verwenden
Das folgende Diagramm zeigt den Workflow zur Dataflow-Fehlerbehebung, der auf dieser Seite beschrieben wird.
Versuchen Sie es mit den folgenden Maßnahmen:
- Optimieren Sie Ihre Pipeline nach Möglichkeit, um die Speichernutzung zu reduzieren.
- Wenn es sich um einen Batchjob handelt, führen Sie die folgenden Schritte in der angegebenen Reihenfolge aus:
- Verwenden Sie einen Maschinentyp mit mehr Arbeitsspeicher pro vCPU.
- Reduzieren Sie die Anzahl der Threads auf weniger als die Anzahl der vCPUs pro Worker.
- Verwenden Sie einen benutzerdefinierten Maschinentyp mit mehr Arbeitsspeicher pro vCPU.
- Wenn es sich um einen Streamingjob handelt, für den Python verwendet wird, reduzieren Sie die Anzahl der Threads auf weniger als 12.
- Wenn es sich um einen Streamingjob handelt, für den Java oder Go verwendet wird, versuchen Sie Folgendes:
- Reduzieren Sie die Anzahl der Threads auf weniger als 500 für Runner v2-Jobs oder auf weniger als 300 für Jobs, die Runner v2 nicht verwenden.
- Verwenden Sie einen Maschinentyp mit mehr Arbeitsspeicher.
Pipeline optimieren
Mehrere Pipelinevorgänge können zu Speicherfehlern führen. Dieser Abschnitt bietet Optionen zur Reduzierung der Speichernutzung Ihrer Pipeline. Verwenden Sie Cloud Profiler, um die Pipelineleistung zu überwachen und um die Pipelinephasen zu identifizieren, die den meisten Arbeitsspeicher belegen.
Mit den folgenden Best Practices können Sie Ihre Pipeline optimieren:
- Integrierte E/A-Connectors von Apache Beam zum Lesen von Dateien verwenden
- Vorgänge bei der Verwendung von
GroupByKey
PTransforms neu gestalten - Eingehenden Traffic aus externen Quellen reduzieren
- Objekte über Threads hinweg freigeben
- Speichereffiziente Elementdarstellungen verwenden
- Größe der Nebeneingaben verringern
- Splittable DoFns von Apache Beam verwenden
Integrierte E/A-Connectors von Apache Beam zum Lesen von Dateien verwenden
Öffnen Sie keine großen Dateien in einem DoFn
. Verwenden Sie zum Lesen von Dateien integrierte E/A-Connectors von Apache Beam.
Dateien, die in einem DoFn
geöffnet werden, müssen in den Arbeitsspeicher passen. Da mehrere DoFn
-Instanzen gleichzeitig ausgeführt werden, können große Dateien, die in DoFn
geöffnet sind, zu wenig Arbeitsspeicher führen.
Vorgänge bei der Verwendung von GroupByKey
PTransforms neu gestalten
Wenn Sie eine GroupByKey
PTransform in Dataflow verwenden, werden die resultierenden Werte pro Schlüssel und pro Fenster in einem einzigen Thread verarbeitet. Da diese Daten als Stream vom Dataflow-Back-End-Dienst an die Worker übergeben werden, müssen sie nicht in den Worker-Arbeitsspeicher passen. Sind die Werte jedoch
im Arbeitsspeicher gesammelt, kann die Verarbeitungslogik Fehler aufgrund fehlenden Speichers verursachen.
Wenn Sie beispielsweise einen Schlüssel haben, der Daten für ein Fenster enthält, und Sie die Schlüsselwerte zu einem speicherinternen Objekt wie einer Liste hinzufügen, kann es zu Fehlern aufgrund von fehlendem Speicherplatz kommen. In diesem Szenario verfügt der Worker möglicherweise nicht über genügend Arbeitsspeicherkapazität, um alle Objekte zu enthalten.
Weitere Informationen zu GroupByKey
PTransforms finden Sie in der Apache Beam-Dokumentation zu Python GroupByKey
und Java GroupByKey
.
Die folgende Liste enthält Vorschläge zum Entwerfen Ihrer Pipeline, um den Speicherverbrauch bei Verwendung von GroupByKey
PTransforms zu minimieren.
- Um die Datenmenge pro Schlüssel und pro Fenster zu reduzieren, sollten Sie Schlüssel mit vielen Werten vermeiden, die auch als „heiße“ Schlüssel bezeichnet werden.
- Wenn Sie die Menge der pro Fenster erhobenen Daten reduzieren möchten, verwenden Sie eine kleinere Fenstergröße.
- Wenn Sie Werte eines Schlüssels in einem Fenster verwenden, um eine Zahl zu berechnen, verwenden Sie die
Combine
-Transformation. Führen Sie die Berechnung nicht in einer einzelnenDoFn
-Instanz durch, nachdem Sie die Werte erfasst haben. - Filtern Sie Werte oder Duplikate vor der Verarbeitung. Weitere Informationen finden Sie in der Transformationsdokumentation zu Python
Filter
und JavaFilter
.
Eingehende Daten aus externen Quellen reduzieren
Wenn Sie externe APIs oder Datenbanken für die Datenanreicherung aufrufen, müssen die zurückgegebenen Daten in den Arbeitsspeicher des Workers passen.
Wenn Sie Aufrufe zusammenfassen, empfiehlt sich die Verwendung einer GroupIntoBatches
-Transformation.
Wenn Fehler aufgrund fehlenden Speichers auftreten, verringern Sie die Batchgröße. Weitere Informationen zum Gruppieren in Batches finden Sie in der Transformationsdokumentation zu