In diesem Dokument werden Best Practices zur Optimierung Ihrer Dataflow-Jobs mit dem Ziel der Kostenminimierung beschrieben. Es werden Faktoren erläutert, die sich auf die Kosten auswirken, und Techniken zum Überwachen und Verwalten dieser Kosten vorgestellt.
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 Jobkosten haben:
- Laufzeiteinstellungen
- Pipelineleistung
- Anforderungen an den Durchsatz der Pipeline
In den folgenden Abschnitten finden Sie Details zum Monitoring Ihrer Jobs, zu Faktoren, die sich auf die Jobkosten auswirken, und Vorschläge zur Verbesserung der Pipeline-Effizienz.
SLOs definieren
Bevor Sie mit der Optimierung beginnen, definieren Sie die Service Level Objectives (SLOs) Ihrer Pipeline, insbesondere für Durchsatz und Latenz. Anhand dieser Anforderungen können Sie Kompromisse zwischen Kosten und anderen Faktoren abwägen.
- Wenn Ihre Pipeline eine niedrige End-to-End-Aufnahmelatenz erfordert, können die Pipelinekosten höher sein.
- Wenn Sie verspätet eintreffende Daten verarbeiten müssen, können die Gesamtkosten der Pipeline höher sein.
- Wenn Ihre Streamingpipeline Datenspitzen verarbeiten muss, benötigt sie möglicherweise zusätzliche Kapazität, was die Kosten erhöhen kann.
Monitoring von Jobs
Um herauszufinden, wie Sie Ihren Job optimieren können, müssen Sie zuerst sein Verhalten verstehen. Verwenden Sie die Dataflow-Monitoring-Tools, um die Pipeline während der Ausführung zu beobachten. Anhand dieser Informationen können Sie dann die Leistung und Effizienz verbessern.
Kostenmonitoring
Verwenden Sie die folgenden Methoden, um Kosten vorherzusagen und zu überwachen.
- Führen Sie vor dem Ausführen der Pipeline in der Produktion einen oder mehrere kleinere Jobs für eine Teilmenge Ihrer Daten aus. Für viele Pipelines kann diese Technik eine Kostenschätzung liefern.
- Auf der Seite Kosten in der Dataflow-Monitoring-Oberfläche können Sie die geschätzten Kosten Ihrer Jobs im Blick behalten. Die geschätzten Kosten können aus verschiedenen Gründen wie beispielsweise vertragliche Rabatte von den tatsächlichen Jobkosten abweichen. 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, können 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
Überwachen Sie Ihre Jobs und identifizieren Sie Bereiche, in denen Sie die Pipeline-Effizienz verbessern können.
- Verwenden Sie die Dataflow-Job-Monitoring-Oberfläche, um Probleme in Ihren Pipelines zu identifizieren. Die Monitoring-Oberfläche enthält eine Jobgrafik und Ausführungsdetails für jede Pipeline. Mit beiden Tools können Sie Ihre Pipeline besser verstehen und langsame Phasen, hängende Phasen oder Schritte mit zu viel Echtzeit identifizieren.
- Verwenden Sie den Metrics Explorer, um detaillierte Dataflow-Jobmesswerte aufzurufen. Sie können benutzerdefinierte Messwerte verwenden, um Leistungsdaten zu erfassen. Der Messwert
Distributionist 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.
- Verwenden Sie die Stichprobenerhebung, um Probleme mit Ihren Daten zu identifizieren. 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 teure 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 das Logging Limits unterliegt und übermäßiges Logging die Jobleistung beeinträchtigen kann.
Laufzeiteinstellungen optimieren
Die folgenden Laufzeiteinstellungen können sich auf die Kosten auswirken:
- Ob Sie einen Streaming- oder einen Batchjob ausführen
- Welcher Dienst zum Ausführen des Jobs verwendet wird, z. B. Streaming Engine oder FlexRS
- Maschinentyp, Laufwerksgröße und Anzahl der GPUs in den Worker-VMs
- Der Autoscaling-Modus
- Die anfängliche Anzahl von Workern und die maximale Anzahl von Workern
- Den Streamingmodus (Modus „Genau einmal“ oder „Mindestens einmal“)
In diesem Abschnitt werden mögliche Änderungen beschrieben, die Sie vornehmen können, um Ihren Job zu optimieren. Berücksichtigen Sie das Design und die Anforderungen Ihrer Pipeline, um festzustellen, ob diese Vorschläge für Ihre Arbeitslast geeignet sind. Nicht alle Vorschläge sind für alle Pipelines geeignet oder hilfreich.
Bevor Sie umfangreiche Änderungen vornehmen, testen Sie die Änderungen an kleinen Pipelines, 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 Nachrichtensystemen. Überlegen Sie, wo sich diese befinden.
- Führen Sie den Job in derselben Region aus, in der sich die Ressourcen befinden, die der Job verwendet.
- Erstellen Sie Ihren Cloud Storage-Bucket zum Speichern von Staging- und temporären Jobdateien in derselben Region wie Ihren Job. Weitere Informationen finden Sie in den Pipelineoptionen
gcpTempLocationundtemp_location.
Maschinentypen anpassen
Die folgenden Anpassungen an Worker-VMs können die Kosteneffizienz verbessern.
- Führen Sie den Job mit dem kleinsten erforderlichen Maschinentyp aus. Passen Sie den Maschinentyp je nach Pipelineanforderungen an. Bei Streamingjobs mit CPU-intensiven Pipelines kann es beispielsweise sinnvoll sein, den Maschinentyp vom Standardtyp zu ändern. Weitere Informationen finden Sie unter Maschinentyp.
- Verwenden Sie für arbeitsspeicher- oder rechenintensive Arbeitslasten geeignete Maschinentypen. Weitere Informationen finden Sie unter CoreMark-Bewertungen von VMs nach Familie.
- Legen Sie die anfängliche Anzahl von Workern fest. Wenn ein Job hochskaliert wird, muss die Arbeit auf die neuen VMs umverteilt werden. Wenn Sie wissen, wie viele Worker Ihre Jobs benötigen, können Sie diese Kosten vermeiden, indem Sie die anfängliche Anzahl von Workern festlegen. Verwenden Sie die Pipelineoption
numWorkersodernum_workers, um die anfängliche Anzahl von Workern 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 begrenzen. Wenn Sie die Pipeline zum ersten Mal testen, beginnen Sie mit einem relativ niedrigen Maximum. 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 einen Höchstwert 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 richtigen Anpassung 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 nacheinander ausgeführt, was sich auf die Leistung und die 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 Kombination von VMs auf Abruf und Standard-VMs sorgt FlexRS dafür, dass Ihre Pipeline auch dann weiter verarbeitet wird, wenn Compute Engine die VMs auf Abruf vorzeitig beendet.
Sehr kleine Jobs vermeiden
Vermeiden Sie nach Möglichkeit die Ausführung von Jobs, die sehr kleine Datenmengen verarbeiten. 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 weniger Jobs mit mehr Daten ausführen, kann dies die Effizienz verbessern.
Achten Sie darauf, dass Dataflow Shuffle aktiviert ist. Batchjobs verwenden Dataflow Shuffle standardmäßig.
Autoscaling-Einstellungen anpassen
Standardmäßig wird für Batchjobs Autoscaling verwendet. Für einige Jobs, z. B. kurz laufende Jobs, ist Autoscaling nicht erforderlich. Wenn Sie der Meinung sind, dass Ihre Pipeline nicht vom Autoscaling profitiert, deaktivieren Sie es. Weitere Informationen finden Sie unter Horizontales Autoscaling.
Sie können auch die dynamische Thread-Skalierung verwenden, damit Dataflow die Thread-Anzahl basierend auf der CPU-Auslastung anpasst.
Wenn Sie die optimale Anzahl von Threads für den Job kennen, können Sie die Anzahl der Threads pro Worker auch explizit mit der Pipelineoption numberOfWorkerHarnessThreads oder number_of_worker_harness_threads festlegen.
Jobs mit langer Ausführungszeit beenden
Sie können festlegen, dass Ihre Jobs automatisch beendet werden, wenn sie eine vordefinierte Laufzeit überschreiten. Wenn Sie ungefähr wissen, wie lange die Ausführung Ihres Jobs dauert, können Sie die Dienstoption max_workflow_runtime_walltime_seconds verwenden, um den Job automatisch zu beenden, wenn er länger als erwartet dauert.
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 von den Worker-VMs in das Dataflow-Dienst-Backend, um die Effizienz zu steigern. Es wird empfohlen, Streaming Engine für Ihre Streamingjobs zu verwenden.
Modus „Mindestens einmal“ verwenden
Dataflow unterstützt zwei Modi für Streamingjobs: den Modus „Genau einmal“ und den Modus „Mindestens einmal“. Wenn Ihre Arbeitslast doppelte Datensätze tolerieren kann, kann der Modus „Mindestens einmal“ die Kosten Ihres Jobs erheblich reduzieren. Bevor Sie den Modus „Mindestens einmal“ aktivieren, sollten Sie prüfen, ob für Ihre Pipeline die 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 Rabatten für zugesicherte Nutzung können Sie die Kosten für Ihre Dataflow-Jobs potenziell senken.
Sie können auch die ressourcenbasierte Abrechnung verwenden. 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
Verwenden Sie Autoscaling-Hinweise und Latenzstufen, um Ihre Autoscaling-Einstellungen zu optimieren. Weitere Informationen finden Sie unter Horizontales Autoscaling für Streamingpipelines optimieren. Bei Streamingjobs, die die Streaming Engine verwenden, können Sie die Einstellungen für die automatische Abstimmung 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 vom Autoscaling profitiert, deaktivieren Sie es. 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.
Jobs mit langer Ausführungszeit beenden
Bei Streamingjobs wiederholt Dataflow fehlgeschlagene Arbeitselemente unbegrenzt. Der Job 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, können weniger kosten. Die folgenden Faktoren können sich auf die Pipelineleistung auswirken:
- Die für Ihren Job verfügbare Parallelität
- Die Effizienz der in der Pipeline verwendeten Transformationen, E/A-Connectors und Codierer
- Der 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 Verwaltung der Parallelisierung durch Dataflow und der verwendeten Optimierungsstrategien. Dataflow-Jobs verwenden mehrere Worker-VMs und auf jedem Worker werden mehrere Threads ausgeführt. Element-Bundles aus einer
PCollectionwerden auf die einzelnen Arbeitsthreads verteilt.
Beachten Sie beim Schreiben Ihres Pipelinecodes 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.
- Folgen Sie den Best Practices für das Schreiben von Pipelinecode.
- Folgen Sie den Best Practices für E/A-Connectors.
- Für Python-Pipelines sollten Sie benutzerdefinierte Container verwenden. Durch das Vorverpacken von Abhängigkeiten wird die Startzeit des Workers verkürzt.
Logging
Beachten Sie beim Logging die folgenden Best Practices:
- Übermäßiges Logging kann die Leistung beeinträchtigen.
- Wenn Sie das Logvolumen reduzieren möchten, können Sie die Logebene der Pipeline ändern. Weitere Informationen finden Sie unter Logvolumen steuern.
- Protokollieren Sie keine einzelnen Elemente. Aktivieren Sie stattdessen die Stichprobenerhebung.
- Verwenden Sie ein Dead-Letter-Muster für elementbezogene Fehler, anstatt jeden Fehler zu protokollieren.
Test
Das Testen Ihrer Pipeline bietet viele Vorteile, z. B. Unterstützung bei SDK-Upgrades, Pipeline-Refaktorierung und 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 umfangreiche Pipelines mit realistischen Testdaten für Ihre 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 eine Absturzwiederherstellung zu simulieren.
Weitere Informationen zum Erstellen von Unit-Tests, Integrationstests und End-to-End-Tests finden Sie unter Pipeline testen.
Beispiele für Tests finden Sie im GitHub-Repository dataflow-ordered-processing.