In diesem Dokument werden Best Practices zur Optimierung Ihrer Dataflow-Jobs beschrieben, um Kosten zu minimieren. Darin werden Faktoren erläutert, die sich auf die Kosten auswirken, und Techniken zum Überwachen und Verwalten dieser Kosten beschrieben.
Weitere Informationen zur Berechnung der Kosten für Dataflow-Jobs finden Sie unter Dataflow-Preise.
Mehrere Faktoren können einen großen Einfluss auf die Kosten eines Jobs haben:
- Laufzeiteinstellungen
- Pipelineleistung
- Anforderungen an den Pipelinedurchsatz
In den folgenden Abschnitten finden Sie Informationen dazu, wie Sie Ihre Jobs überwachen, welche Faktoren sich auf die Jobkosten auswirken und wie Sie die Pipelineeffizienz verbessern können.
SLOs definieren
Bevor Sie mit der Optimierung beginnen, sollten Sie die Service Level Objectives (SLOs) Ihrer Pipeline definieren, insbesondere für Durchsatz und Latenz. Anhand dieser Anforderungen können Sie Kompromisse zwischen Kosten und anderen Faktoren abwägen.
- Wenn für Ihre Pipeline eine geringe End-to-End-Latenz bei der Aufnahme erforderlich ist, können die Kosten für die Pipeline höher sein.
- Wenn Sie verspätet eingehende Daten verarbeiten müssen, können die Gesamtkosten für die Pipeline höher sein.
- Wenn in Ihrer Streamingpipeline Daten-Spikes auftreten, die verarbeitet werden müssen, benötigt die Pipeline möglicherweise zusätzliche Kapazität, was die Kosten erhöhen kann.
Monitoring von Jobs
Um zu entscheiden, wie Sie Ihren Job optimieren können, müssen Sie zuerst sein Verhalten verstehen. Mit den Dataflow-Monitoring-Tools können Sie Ihre Pipeline während der Ausführung beobachten. Anhand dieser Informationen können Sie dann die Leistung und Effizienz verbessern.
Kostenmonitoring
Mit den folgenden Methoden können Sie Kosten vorhersagen und überwachen.
- Bevor Sie die Pipeline in der Produktion ausführen, sollten Sie einen oder mehrere kleinere Jobs für eine Teilmenge Ihrer Daten ausführen. Bei vielen Pipelines kann mit dieser Methode eine Kostenschätzung erstellt werden.
- Verwenden Sie die Seite Kosten in der Dataflow-Monitoring-Oberfläche, um die geschätzten Kosten Ihrer Jobs zu überwachen. Die geschätzten Kosten spiegeln möglicherweise aus verschiedenen Gründen nicht die tatsächlichen Jobkosten wider, z. B. vertragliche Rabatte. Sie können jedoch eine gute Grundlage für die Kostenoptimierung sein. Weitere Informationen finden Sie unter Kostenmonitoring.
- Cloud Billing-Daten nach BigQuery exportieren und eine Kostenanalyse für die Abrechnungsexporttabellen durchführen. Mit dem Cloud Billing-Export können Sie detaillierte Google Cloud -Abrechnungsdaten automatisch im Laufe des Tages in ein BigQuery-Dataset exportieren. Abrechnungsdaten umfassen Nutzungs-, Kostenschätzungs- und Preisdaten.
- Um unerwartete Kosten zu vermeiden, sollten Sie Monitoring-Benachrichtigungen erstellen, wenn Ihr Dataflow-Job einen von Ihnen definierten Grenzwert überschreitet. Weitere Informationen finden Sie unter Cloud Monitoring für Dataflow-Pipelines verwenden.
Job-Monitoring
Beobachten Sie Ihre Jobs und ermitteln Sie Bereiche, in denen Sie die Effizienz der Pipeline verbessern können.
- Verwenden Sie die Dataflow-Job-Monitoring-Oberfläche, um Probleme in Ihren Pipelines zu erkennen. Die Monitoring-Oberfläche zeigt für jede Pipeline ein Jobdiagramm und Ausführungsdetails an. Mit beiden Tools können Sie Ihre Pipeline besser verstehen und langsame oder hängen gebliebene Phasen oder Schritte mit zu viel Wandzeit ermitteln.
- Mit dem Metrics Explorer können Sie detaillierte Dataflow-Jobmesswerte aufrufen. Mit benutzerdefinierten Messwerten lassen sich Leistungsdaten erfassen. Der Messwert
Distribution
ist besonders nützlich, um Leistungsdaten zu erfassen. - Verwenden Sie für CPU-intensive Pipelines Cloud Profiler, um die Teile des Pipelinecodes zu identifizieren, die die meisten Ressourcen beanspruchen.
- Mit Stichprobenerhebung können Sie Probleme mit Ihren Daten ermitteln. Mit der Stichprobenerhebung können Sie die Daten bei jedem Schritt einer Dataflow-Pipeline beobachten. Diese Informationen können Ihnen bei der Fehlerbehebung in Ihrer Pipeline helfen, da Sie die tatsächlichen Ein- und Ausgaben in einem laufenden oder abgeschlossenen Job anzeigen.
- Passen Sie das Dashboard für Projektmonitoring an, um potenziell kostspielige Jobs anzuzeigen. Weitere Informationen finden Sie unter Dataflow-Monitoring-Dashboard anpassen.
Es wird nicht empfohlen, Verarbeitungsmesswerte pro Element in Pipelines mit hohem Volumen zu protokollieren, da die Protokollierung Beschränkungen unterliegt und eine übermäßige Protokollierung die Jobleistung beeinträchtigen kann.
Laufzeiteinstellungen optimieren
Die folgenden Laufzeiteinstellungen können sich auf die Kosten auswirken:
- Ob Sie einen Streaming- oder Batchjob ausführen
- Welchen Dienst Sie zum Ausführen des Jobs verwenden, z. B. Streaming Engine oder FlexRS
- Der Maschinentyp, die Laufwerkgröße und die Anzahl der GPUs in den Worker-VMs
- Der Autoscaling-Modus
- Die anfängliche und die maximale Anzahl von Workern
- Der Streamingmodus („Genau einmal“-Modus oder „Mindestens einmal“-Modus)
In diesem Abschnitt werden mögliche Änderungen beschrieben, die Sie vornehmen können, um Ihren Job zu optimieren. Um festzustellen, ob diese Vorschläge für Ihre Arbeitslast geeignet sind, sollten Sie Ihr Pipelinedesign und Ihre Anforderungen berücksichtigen. Nicht alle Vorschläge sind für alle Pipelines geeignet oder hilfreich.
Bevor Sie größere Änderungen vornehmen, sollten Sie sie an kleinen Pipelines testen, die eine Teilmenge Ihrer Daten verwenden. Weitere Informationen finden Sie unter Begrenzte Tests für große Jobs ausführen in „Best Practices für große Batchpipelines“.
Arbeitsort
Die meisten Dataflow-Jobs interagieren mit anderen Diensten wie Datenspeichern und Messaging-Systemen. Überlegen Sie, wo sich diese befinden.
- Führen Sie Ihren Job in derselben Region wie die Ressourcen aus, die von Ihrem Job verwendet werden.
- Erstellen Sie Ihren Cloud Storage-Bucket zum Speichern von Staging- und temporären Jobdateien in derselben Region wie Ihren Job. Weitere Informationen finden Sie unter den Pipelineoptionen
gcpTempLocation
undtemp_location
.
Maschinentypen anpassen
Die folgenden Anpassungen an Worker-VMs können die Kosteneffizienz verbessern.
- Führen Sie Ihren Job mit dem kleinsten erforderlichen Maschinentyp aus. Passen Sie den Maschinentyp nach Bedarf an die Pipelineanforderungen an. Bei Streamingjobs mit CPU-intensiven Pipelines kann es beispielsweise sinnvoll sein, den Maschinentyp vom Standardwert zu ändern. Weitere Informationen finden Sie unter Maschinentyp.
- Verwenden Sie für speicherintensive oder rechenintensive Arbeitslasten geeignete Maschinentypen. Weitere Informationen finden Sie unter CoreMark-Bewertungen von VMs nach Familie.
- Legen Sie die anfängliche Anzahl der Worker fest. Wenn ein Job skaliert wird, muss die Arbeit auf die neuen VMs verteilt werden. Wenn Sie wissen, wie viele Worker für Ihre Jobs benötigt werden, können Sie diese Kosten vermeiden, indem Sie die anfängliche Anzahl der Worker festlegen. Verwenden Sie die Pipelineoption
numWorkers
odernum_workers
, um die anfängliche Anzahl der Worker festzulegen. - Legen Sie die maximale Anzahl von Workern fest. Wenn Sie einen Wert für diesen Parameter festlegen, können Sie die Gesamtkosten Ihres Jobs möglicherweise begrenzen. Wenn Sie die Pipeline zum ersten Mal testen, sollten Sie mit einem relativ niedrigen Maximum beginnen. Erhöhen Sie dann den Wert, bis er hoch genug ist, um eine Produktionsarbeitslast auszuführen. Berücksichtigen Sie die SLOs Ihrer Pipeline, bevor Sie ein Maximum festlegen. Weitere Informationen finden Sie unter Horizontales Autoscaling.
- Verwenden Sie Right Fitting, um die Ressourcenanforderungen für bestimmte Pipelineschritte anzupassen.
- Einige Pipelines profitieren von der Verwendung von GPUs. Weitere Informationen finden Sie unter GPUs mit Dataflow. Mit der Funktion „Right-Fitting“ können Sie GPUs für bestimmte Schritte der Pipeline konfigurieren.
- Achten Sie darauf, dass Sie genügend Netzwerkbandbreite haben, um auf Daten von Ihren Worker-VMs zuzugreifen, insbesondere wenn Sie auf lokale Daten zugreifen müssen.
Einstellungen für Batchjobs optimieren
In diesem Abschnitt finden Sie Vorschläge zur Optimierung der Laufzeiteinstellungen für Batchjobs. Bei Batchjobs werden die Jobphasen sequenziell ausgeführt, was sich auf Leistung und Kosten auswirken kann.
Flexible Ressourcenplanung verwenden
Wenn Ihr Batchjob nicht zeitkritisch ist, sollten Sie Flexible Resource Scheduling (FlexRS) verwenden. FlexRS reduziert die Kosten für die Batchverarbeitung, indem der beste Zeitpunkt für den Start des Jobs ermittelt und dann eine Kombination aus VM-Instanzen auf Abruf und Standard-VMs verwendet wird. VMs auf Abruf sind im Vergleich zu Standard-VMs zu einem viel niedrigeren Preis verfügbar, was die Gesamtkosten senken kann. Durch die Verwendung einer Kombination aus vorzeitig beendbaren und Standard-VMs trägt FlexRS dazu bei, dass Ihre Pipeline weiter verarbeitet wird, auch wenn Compute Engine die vorzeitig beendbaren VMs vorzeitig beendet.
Sehr kleine Jobs vermeiden
Vermeiden Sie nach Möglichkeit die Ausführung von Jobs, bei denen nur sehr geringe Datenmengen verarbeitet werden. Führen Sie nach Möglichkeit weniger Jobs für größere Datasets aus. Das Starten und Beenden von Worker-VMs verursacht Kosten. Wenn Sie also weniger Jobs für mehr Daten ausführen, kann die Effizienz gesteigert werden.
Dataflow Shuffle muss aktiviert sein. Batchjobs verwenden Dataflow Shuffle standardmäßig.
Autoscaling-Einstellungen anpassen
Standardmäßig verwenden Batchjobs Autoscaling. Für einige Jobs, z. B. kurz laufende Jobs, ist Autoscaling nicht erforderlich. Wenn Sie der Meinung sind, dass Ihre Pipeline nicht von Autoscaling profitiert, können Sie es deaktivieren. Weitere Informationen finden Sie unter Horizontales Autoscaling.
Sie können auch die dynamische Thread-Skalierung verwenden, damit Dataflow die Anzahl der Threads basierend auf der CPU-Auslastung anpasst.
Alternativ können Sie die Anzahl der Threads pro Worker mit der Pipelineoption numberOfWorkerHarnessThreads
oder number_of_worker_harness_threads
explizit festlegen, wenn Sie die optimale Anzahl der Threads für den Job kennen.
Lange laufende Jobs beenden
Legen Sie fest, dass Ihre Jobs automatisch beendet werden, wenn sie eine bestimmte Laufzeit überschreiten. Wenn Sie ungefähr wissen, wie lange die Ausführung Ihres Jobs dauert, können Sie die max_workflow_runtime_walltime_seconds
-Dienstoption verwenden, um den Job automatisch zu beenden, wenn er länger als erwartet ausgeführt wird.
Einstellungen für Streamingjobs optimieren
In diesem Abschnitt finden Sie Vorschläge zur Optimierung der Laufzeiteinstellungen für Streamingjobs.
Streaming Engine verwenden
Streaming Engine verschiebt die Pipelineausführung aus den Worker-VMs in das Dataflow-Dienst-Backend, um die Effizienz zu steigern. Es wird empfohlen, Streaming Engine für Ihre Streamingjobs zu verwenden.
Mindestens einmalige Übermittlung
Dataflow unterstützt zwei Modi für Streamingjobs: den „Genau einmal“-Modus und den „Mindestens einmal“-Modus. Wenn Ihre Arbeitslast doppelte Datensätze tolerieren kann, können Sie die Kosten Ihres Jobs mit dem „Mindestens einmal“-Modus erheblich senken. Bevor Sie den Modus „Mindestens einmal“ aktivieren, sollten Sie prüfen, ob für Ihre Pipeline eine genau einmalige Verarbeitung von Datensätzen erforderlich ist. Weitere Informationen finden Sie unter Pipeline-Streamingmodus festlegen.
Preismodell auswählen
Rabatte für zugesicherte Nutzung (Committed Use Discounts, CUDs) für Dataflow-Streamingjobs sind Preisnachlässe für Nutzer, die sich verpflichten, für ein Jahr oder länger kontinuierlich eine bestimmte Menge von Dataflow-Rechenressourcen zu nutzen. Dataflow-CUDs sind nützlich, wenn Ihre Ausgaben für Dataflow-Rechenkapazität für Streamingjobs einen vorhersehbaren Mindestwert haben, den Sie mindestens für ein Jahr zusichern können. Mit CUDs können Sie die Kosten für Ihre Dataflow-Jobs möglicherweise senken.
Sie sollten auch die ressourcenbasierte Abrechnung in Betracht ziehen. Bei der ressourcenbasierten Abrechnung werden die von Ihrem Job verbrauchten Streaming Engine-Ressourcen in Rechnung gestellt und in Streaming Engine-Recheneinheiten gemessen. Ihnen werden die Worker-CPU, der Worker-Arbeitsspeicher und die Streaming Engine-Recheneinheiten in Rechnung gestellt.
Autoscaling-Einstellungen anpassen
Mit Autoscaling-Hinweisen können Sie Ihre Autoscaling-Einstellungen optimieren. Weitere Informationen finden Sie unter Horizontales Autoscaling für Streamingpipelines optimieren. Bei Streamingjobs, die Streaming Engine verwenden, können Sie die Einstellungen für die automatische Optimierung aktualisieren, ohne den Job zu beenden oder zu ersetzen. Weitere Informationen finden Sie unter Aktualisierung der Option des laufenden Jobs.
Wenn Sie der Meinung sind, dass Ihre Pipeline nicht von Autoscaling profitiert, können Sie es deaktivieren. Weitere Informationen finden Sie unter Horizontales Autoscaling.
Wenn Sie die optimale Anzahl von Threads für den Job kennen, legen Sie die Anzahl der Threads pro Worker explizit mit der Pipelineoption numberOfWorkerHarnessThreads
oder number_of_worker_harness_threads
fest.
Lange laufende Jobs beenden
Bei Streamingjobs wiederholt Dataflow fehlgeschlagene Arbeitselemente unbegrenzt. Das Arbeitsverhältnis wird nicht beendet. Der Job kann jedoch verzögert werden, bis das Problem behoben ist. Erstellen Sie Monitoring-Richtlinien, um Anzeichen für eine blockierte Pipeline zu erkennen, z. B. eine Erhöhung der Systemlatenz und eine Verringerung der Datenaktualität. Implementieren Sie die Fehlerprotokollierung in Ihrem Pipelinecode, um Arbeitselemente zu identifizieren, die wiederholt fehlschlagen.
- Informationen zum Überwachen von Pipelinefehlern finden Sie unter Anzahl der Logs mit Worker-Fehlern.
- Informationen zur Fehlerbehebung finden Sie unter Fehlerbehebung bei Dataflow-Fehlern.
Pipelineleistung
Pipelines, die schneller ausgeführt werden, kosten möglicherweise weniger. Die folgenden Faktoren können sich auf die Leistung von Pipelines auswirken:
- Die für Ihren Job verfügbare Parallelität
- Die Effizienz der in der Pipeline verwendeten Transformationen, E/A-Connectors und Coder
- Speicherort der Daten
Der erste Schritt zur Verbesserung der Pipelineleistung besteht darin, das Verarbeitungsmodell zu verstehen:
- Informationen zum Apache Beam-Modell und zum Apache Beam-Ausführungsmodell
- Weitere Informationen zum Pipeline-Lebenszyklus, einschließlich der Parallelisierung und der Optimierungsstrategien, die Dataflow verwendet. Dataflow-Jobs verwenden mehrere Worker-VMs und auf jedem Worker werden mehrere Threads ausgeführt. Elementbündel aus einem
PCollection
werden an jeden Worker-Thread verteilt.
Beachten Sie beim Schreiben von Pipelinecode die folgenden Best Practices:
- Verwenden Sie nach Möglichkeit die neueste unterstützte Apache Beam SDK-Version. In den Versionshinweisen finden Sie Informationen zu den Änderungen in den verschiedenen Versionen.
- Best Practices für das Schreiben von Pipelinecode
- Halten Sie sich an die Best Practices für E/A-Connectors.
- Für Python-Pipelines sollten Sie benutzerdefinierte Container verwenden. Durch das Vorabverpacken von Abhängigkeiten wird die Startzeit des Workers verkürzt.
Logging
Beachten Sie beim Logging die folgenden Best Practices:
- Eine übermäßige Protokollierung kann die Leistung beeinträchtigen.
- Um das Logvolumen zu reduzieren, können Sie die Log-Ebene der Pipeline ändern. Weitere Informationen finden Sie unter Logvolumen steuern.
- Protokollieren Sie keine einzelnen Elemente. Aktivieren Sie stattdessen die Stichprobenerhebung.
- Verwenden Sie für Fehler pro Element ein Dead-Letter-Muster, anstatt jeden Fehler zu protokollieren.
Test
Das Testen Ihrer Pipeline bietet viele Vorteile, z. B. bei SDK-Upgrades, beim Umstrukturieren von Pipelines und bei Code-Reviews. Viele Optimierungen, z. B. die Überarbeitung benutzerdefinierter CPU-intensiver Transformationen, können lokal getestet werden, ohne dass ein Job in Dataflow ausgeführt werden muss.
Testen Sie Pipelines im großen Maßstab mit realistischen Testdaten für Ihren Arbeitslast, einschließlich der Gesamtzahl der Elemente für Batchpipelines, der Anzahl der Elemente pro Sekunde für Streamingpipelines, der Elementgröße und der Anzahl der Schlüssel. Testen Sie Ihre Pipelines in zwei Modi: im stabilen Zustand und bei der Verarbeitung eines großen Backlogs, um die Wiederherstellung nach einem Absturz zu simulieren.
Weitere Informationen zum Erstellen von Unit-, Integrations- und End-to-End-Tests finden Sie unter Pipeline testen.
Beispiele für Tests finden Sie im dataflow-ordered-processing
GitHub-Repository.