In diesem Dokument werden Best Practices zur Optimierung Ihrer Dataflow-Jobs beschrieben, um die Kosten zu minimieren. Darin werden Faktoren erläutert, die sich auf die Kosten auswirken, und es werden Methoden zur Überwachung und Verwaltung 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 Auftragskosten haben:
- Laufzeiteinstellungen
- Pipelineleistung
- Anforderungen an den Pipelinedurchsatz
In den folgenden Abschnitten finden Sie Details zum Überwachen Ihrer Jobs, Faktoren, die sich auf die Jobkosten auswirken, und Vorschläge zur Verbesserung der Pipeline-Effizienz.
SLOs definieren
Bevor Sie mit der Optimierung beginnen, sollten Sie die Service Level Objectives (SLOs) Ihrer Pipeline definieren, insbesondere für Durchsatz und Latenz. Diese Anforderungen helfen Ihnen, Kompromisse zwischen Kosten und anderen Faktoren zu finden.
- Wenn für Ihre Pipeline eine geringe End-to-End-Datenaufnahmelatenz erforderlich ist, sind die Pipelinekosten möglicherweise höher.
- Wenn Sie spät eintreffende Daten verarbeiten müssen, sind die Gesamtkosten der Pipeline möglicherweise höher.
- Wenn in Ihrer Streaming-Pipeline Datenspitzen verarbeitet werden müssen, ist möglicherweise zusätzliche Kapazität erforderlich, was die Kosten erhöhen kann.
Monitoring von Jobs
Um zu bestimmen, 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 Leistung und Effizienz verbessern.
Kostenmonitoring
Mit den folgenden Methoden können Sie Kosten vorhersagen und im Blick behalten.
- Bevor Sie die Pipeline in der Produktion ausführen, sollten Sie einen oder mehrere kleinere Jobs mit einer Teilmenge Ihrer Daten ausführen. Für viele Pipelines kann diese Methode eine Kostenschätzung liefern.
- Auf der Seite Kosten der Dataflow-Monitoring-Oberfläche können Sie die geschätzten Kosten Ihrer Jobs im Blick behalten. Die geschätzten Kosten spiegeln möglicherweise aus verschiedenen Gründen wie vertraglichen Rabatten nicht die tatsächlichen Jobkosten wider. Sie können jedoch eine gute Grundlage für die Kostenoptimierung bieten. Weitere Informationen finden Sie unter Kostenmonitoring.
- Exportieren Sie Cloud Billing-Daten nach BigQuery und führen Sie eine Kostenanalyse für die Tabellen mit Abrechnungsexporten durch. Mit dem Cloud Billing-Export können Sie detaillierte Google Cloud Abrechnungsdaten automatisch im Laufe des Tages in ein BigQuery-Dataset exportieren. Abrechnungsdaten umfassen Nutzungsdaten, Kostenschätzungen und Preisdaten.
- Um unerwartete Kosten zu vermeiden, erstellen Sie Monitoring-Benachrichtigungen, wenn Ihr Dataflow-Job einen von Ihnen festgelegten Grenzwert überschreitet. Weitere Informationen finden Sie unter Cloud Monitoring für Dataflow-Pipelines verwenden.
Job-Monitoring
Beobachten Sie Ihre Jobs und identifizieren Sie Bereiche, in denen Sie die Pipeline-Effizienz verbessern könnten.
- Verwenden Sie die Dataflow-Job-Monitoring-Oberfläche, um Probleme in Ihren Pipelines zu erkennen. Die Monitoring-Oberfläche enthält für jede Pipeline eine Jobgrafik und Ausführungsdetails. Mit beiden Tools können Sie Ihre Pipeline besser nachvollziehen und langsame, hängende oder Schritte mit zu viel Laufzeit erkennen.
- Im Metrics Explorer finden Sie detaillierte Dataflow-Jobmesswerte. Mit benutzerdefinierten Messwerten können Sie Leistungsdaten erfassen. Der Messwert
Distribution
ist besonders nützlich für die Erhebung von Leistungsdaten. - Verwenden Sie für CPU-intensive Pipelines Cloud Profiler, um die Teile des Pipelinecodes zu identifizieren, die die meisten Ressourcen verbrauchen.
- 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.
Es wird nicht empfohlen, Verarbeitungsmesswerte pro Element in Pipelines mit hohem Volumen zu protokollieren, da die Protokollierung Einschrä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 einen Batchjob ausführen
- Welchen Dienst Sie zum Ausführen des Jobs verwenden, z. B. Streaming Engine oder FlexRS
- Maschinentyp, Laufwerkgröße und Anzahl der GPUs in den Worker-VMs
- Autoscaling-Modus
- Die anfängliche und die maximale Anzahl der Worker
- Den Streamingmodus (Genau einmal-Modus oder Mindestens einmal-Modus)
In diesem Abschnitt werden mögliche Änderungen beschrieben, mit denen Sie Ihren Job optimieren können. Berücksichtigen Sie Ihr Pipeline-Design und Ihre Anforderungen, um zu bestimmen, ob diese Vorschläge für Ihre Arbeitslast geeignet sind. 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, in denen nur eine Teilmenge Ihrer Daten verwendet wird. Weitere Informationen finden Sie unter Begrenzte Tests für große Jobs ausführen in „Best Practices für große Batch-Pipelines“.
Arbeitsort
Die meisten Dataflow-Jobs interagieren mit anderen Diensten wie Datenspeichern und Messaging-Systemen. Überlegen Sie, wo sich diese befinden.
- Führen Sie den Job in derselben Region aus wie die Ressourcen, die er verwendet.
- Erstellen Sie einen Cloud Storage-Bucket zum Speichern von Staging- und temporären Jobdateien in derselben Region wie Ihr Job. Weitere Informationen finden Sie unter den Pipelineoptionen
gcpTempLocation
undtemp_location
.
Maschinentypen anpassen
Mit den folgenden Anpassungen an Arbeits-VMs lässt sich die Kosteneffizienz möglicherweise verbessern.
- Führen Sie den Job mit dem kleinstmöglichen erforderlichen Maschinentyp aus. Passen Sie den Maschinentyp nach Bedarf an die Pipelineanforderungen an. Bei Streamingjobs mit CPU-intensiven Pipelines kann es beispielsweise von Vorteil sein, den Standardmaschinentyp 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 neu 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, beginnen Sie mit einem relativ niedrigen Maximum. Erhöhen Sie den Wert dann so lange, bis er hoch genug ist, um eine Produktionsarbeitslast auszuführen. Berücksichtigen Sie Ihre Pipeline-SLOs, bevor Sie ein Maximum festlegen. Weitere Informationen finden Sie unter Horizontales Autoscaling.
- Bei einigen Pipelines ist die Verwendung von GPUs sinnvoll. Weitere Informationen finden Sie unter GPUs mit Dataflow.
- Achten Sie darauf, dass Sie eine ausreichende 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 Leistung und Kosten auswirken kann.
Flexible Ressourcenplanung verwenden
Wenn Ihr Batchjob nicht zeitkritisch ist, können 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 VMs auf Abruf und Standard-VMs sorgt FlexRS dafür, dass Ihre Pipeline weiter verarbeitet wird, auch wenn die Compute Engine die VMs auf Abruf vorzeitig beendet.
Vermeiden Sie sehr kleine Jobs
Vermeiden Sie nach Möglichkeit die Ausführung von Jobs, bei denen sehr kleine Datenmengen verarbeitet werden. Führen Sie bei größeren Datensätzen nach Möglichkeit weniger Jobs aus. Das Starten und Beenden von Worker-VMs verursacht Kosten. Daher kann die Effizienz verbessert werden, wenn weniger Jobs mit mehr Daten ausgeführt werden.
Prüfen Sie, ob Dataflow-Zufallsmix aktiviert ist. Batchjobs verwenden Dataflow Shuffle standardmäßig.
Autoscaling-Einstellungen anpassen
Für Batchjobs wird standardmäßig Autoscaling verwendet. Bei einigen Jobs, z. B. bei kurz laufenden Jobs, ist kein Autoscaling 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 Threadanzahl basierend auf der CPU-Auslastung optimiert.
Wenn Sie die optimale Anzahl der 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.
Lange laufende Jobs beenden
Sie können festlegen, dass 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 mit der max_workflow_runtime_walltime_seconds
Dienstoption den Job automatisch beenden, wenn er länger als erwartet läuft.
Einstellungen für Streamingjobs optimieren
In diesem Abschnitt finden Sie Vorschläge zur Optimierung der Laufzeiteinstellungen für Streamingjobs.
Streaming Engine verwenden
Die Streaming Engine verschiebt die Pipelineausführung aus den Worker-VMs in das Dataflow-Dienst-Backend, um die Effizienz zu steigern. Wir empfehlen, die Streaming Engine für Ihre Streamingjobs zu verwenden.
Mindestens einmal-Modus verwenden
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 mit dem Modus „Mindestens einmal“ die Kosten für Ihren Job erheblich senken. 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. Mithilfe von CUDs können Sie die Kosten Ihrer 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
Mithilfe von Autoscaling-Tipps können Sie Ihre Autoscaling-Einstellungen optimieren. Weitere Informationen finden Sie unter Horizontales Autoscaling für Streamingpipelines optimieren. Bei Streamingjobs, die die Streaming Engine nutzen, 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 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 mit der Pipelineoption numberOfWorkerHarnessThreads
oder number_of_worker_harness_threads
explizit fest.
Lange laufende Jobs 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, sind möglicherweise kostengünstiger. 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 Coder
- Speicherort der Daten
Der erste Schritt zur Verbesserung der Pipelineleistung besteht darin, das Verarbeitungsmodell zu verstehen:
- Weitere Informationen zum Apache Beam-Modell und zum Apache Beam-Ausführungsmodell
- Weitere Informationen zum Pipeline-Lebenszyklus, einschließlich der Parallelisierung in Dataflow und der verwendeten Optimierungsstrategien. Dataflow-Jobs verwenden mehrere Worker-VMs und jeder Worker führt mehrere Threads aus. Element-Bundles aus einer
PCollection
werden an jeden Worker-Thread 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.
- Beachten Sie die Best Practices für das Schreiben von Pipelinecode.
- Beachten Sie die Best Practices für E/A-Connectors.
- Für Python-Pipelines können Sie benutzerdefinierte Container verwenden. Wenn Sie Abhängigkeiten vor dem Paketieren einbinden, 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.
- Sie können das Volumen der Protokolle reduzieren, indem Sie die Logebene der Pipeline ändern. Weitere Informationen finden Sie unter Log-Volume steuern.
- Einzelne Elemente nicht protokollieren Aktivieren Sie stattdessen die Stichprobenerhebung.
- Verwenden Sie für Fehler auf Elementebene ein Dead-Letter-Muster, anstatt jeden Fehler zu protokollieren.
Test
Das Testen Ihrer Pipeline bietet viele Vorteile, z. B. bei SDK-Upgrades, Pipeline-Refaktorisierungen und Codeüberprüfungen. 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 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 Steady State und bei der Verarbeitung eines großen Backlogs, um einen 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 GitHub-Repository dataflow-ordered-processing
.