In diesem Dokument werden Best Practices zur Optimierung Ihrer Dataflow-Jobs mit dem Ziel der Kostensenkung erläutert. Es werden Faktoren beschrieben, die sich auf die Kosten auswirken, und Techniken zum Monitoring und zur Verwaltung dieser Kosten vorgestellt.
Weitere Informationen zur Berechnung der Kosten für Dataflow Jobs finden Sie unter Dataflow-Preise.
Mehrere Faktoren können sich erheblich auf die Jobkosten auswirken:
- Laufzeiteinstellungen
- Pipelineleistung
- Anforderungen an den Pipeline-Durchsatz
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 Pipelineeffizienz.
SLOs definieren
Bevor Sie mit der Optimierung beginnen, definieren Sie die Service Level Objectives (SLOs) Ihrer Pipeline, insbesondere für Durchsatz und Latenz. Diese Anforderungen helfen Ihnen, Kompromisse zwischen Kosten und anderen Faktoren abzuwägen.
- Wenn Ihre Pipeline eine niedrige End-to-End-Aufnahmelatenz erfordert, können die Pipelinekosten höher sein.
- Wenn Sie Daten verarbeiten müssen, die mit Verzögerung eintreffen, können die Gesamtkosten für die Pipeline höher sein.
- Wenn Ihre Streamingpipeline Datenspitzen aufweist, 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 ermitteln, wie Sie Ihren Job optimieren können, müssen Sie zuerst sein Verhalten verstehen. Verwenden Sie die Dataflow-Monitoringtools, um Ihre Pipeline während der Ausführung zu beobachten. Anschließend können Sie diese Informationen nutzen, um Leistung und Effizienz zu verbessern.
Kostenmonitoring
Verwenden Sie die folgenden Techniken, um Kosten vorherzusagen und zu überwachen.
- Bevor Sie die Pipeline in der Produktion ausführen, führen Sie einen oder mehrere kleinere Jobs für eine Teilmenge Ihrer Daten aus. Bei vielen Pipelines kann diese Technik eine Kostenschätzung liefern.
- Auf der Seite Kosten in der Dataflow-Monitoringoberfläche können Sie die geschätzten Kosten Ihrer Jobs überwachen. Die geschätzten Kosten entsprechen möglicherweise aus verschiedenen Gründen nicht den tatsächlichen Jobkosten, z. B. vertraglichen Rabatten. 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 Abrechnungsexporttabellen durch. Mit dem Cloud Billing -Export können Sie detaillierte Google Cloud Abrechnungsdaten automatisch mehrmals täglich in ein BigQuery-Dataset exportieren lassen. Abrechnungsdaten umfassen Nutzungs-, Kostenschätzungs- und Preisdaten.
- Um unerwartete Kosten zu vermeiden, erstellen Sie Monitoringbenachrichtigungen, wenn Ihr Dataflow-Job einen von Ihnen definierten Schwellenwert überschreitet. Weitere Informationen finden Sie unter Cloud Monitoring für Dataflow-Pipelines verwenden.
Job-Monitoring
Überwachen Sie Ihre Jobs und ermitteln Sie Bereiche, in denen Sie die Pipelineeffizienz verbessern können.
- Verwenden Sie die Dataflow Job-Monitoringoberfläche, um Probleme in Ihren Pipelines zu identifizieren. Die Monitoringoberfläche zeigt ein Jobdiagramm und Ausführungsdetails für jede Pipeline. Mit beiden Tools können Sie Ihre Pipeline besser verstehen und langsame oder blockierte Phasen oder Schritte mit zu viel Echtzeitidentifizieren.
- Im Metrics Explorer
können Sie detaillierte Dataflow-Jobmesswerte ansehen. Sie können benutzerdefinierte Messwerte verwenden, um Leistungsdaten zu erfassen. Der Messwert
Distributionist besonders nützlich für die Erfassung 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.
- Passen Sie das Dashboard für das Projektmonitoring an, um potenziell teure Jobs anzuzeigen. Weitere Informationen finden Sie unter Dataflow-Monitoring-Dashboard anpassen.
Es wird nicht empfohlen, Messwerte zur Verarbeitung einzelner Elemente in Pipelines mit hohem Volumen zu protokollieren, da die Protokollierung Limits 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 Streamingjob oder einen 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 der Worker
- 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 zu ermitteln, ob diese Vorschläge für Ihre Arbeitslast geeignet sind, berücksichtigen Sie das Design und die Anforderungen Ihrer Pipeline. Nicht alle Vorschläge sind für alle Pipelines geeignet oder hilfreich.
Bevor Sie größere Ä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 im Abschnitt "Best Practices für große Batchpipelines."
Ort des Jobs
Die meisten Dataflow-Jobs interagieren mit anderen Diensten wie Datenspeichern und Messaging-Systemen. Berücksichtigen Sie, wo sich diese befinden.
- Führen Sie Ihren Job in derselben Region aus wie die Ressourcen, die er 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 unter den
gcpTempLocationundtemp_locationPipelineoptionen.
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 Ihre Jobs benötigen, können Sie diese Kosten vermeiden, indem Sie die anfängliche Anzahl der Worker festlegen. Verwenden Sie die
numWorkersodernum_workersPipelineoption, um die anfängliche Anzahl der Worker festzulegen. - Legen Sie die maximale Anzahl der Worker 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 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 die richtige Anpassung, um die Ressourcenanforderungen für bestimmte Pipelineschritte anzupassen.
- Bei einigen Pipelines ist die Verwendung von GPUs von Vorteil. 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 über genügend Netzwerkbandbreite verfügen, 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 die flexible Ressourcenplanung (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 viel günstiger, 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 VMs auf Abruf von Compute Engine vorzeitig beendet werden.
Sehr kleine Jobs vermeiden
Vermeiden Sie nach Möglichkeit die Ausführung von Jobs, bei denen sehr kleine 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 verbessert werden.
Achten Sie darauf, dass Dataflow Shuffle aktiviert ist. Batchjobs verwenden Dataflow Shuffle standardmäßig.
Autoscaling-Einstellungen anpassen
Standardmäßig verwenden Batchjobs Autoscaling. Bei einigen Jobs, z. B. kurz laufenden Jobs, ist Autoscaling nicht erforderlich. Wenn Sie der Meinung sind, dass Ihre Pipeline nicht von Autoscaling profitiert, deaktivieren Sie es. Weitere Informationen finden Sie unter Horizontales Autoscaling.
Sie können auch die
dynamische Threadskalierung verwenden, damit
Dataflow die Anzahl der Threads basierend auf der CPU-Auslastung anpasst.
Alternativ können Sie die optimale Anzahl der Threads für den Job ermitteln und die Anzahl der Threads pro Worker explizit
mit der
numberOfWorkerHarnessThreads oder number_of_worker_harness_threads
Pipelineoptionfestlegen.
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 Ihr Job dauert, verwenden Sie die
max_workflow_runtime_walltime_seconds
Dienstoption
, 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 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, kann der „Mindestens einmal“-Modus die Kosten Ihres Jobs erheblich senken. Bevor Sie den „Mindestens einmal“-Modus aktivieren, prüfen Sie, ob Ihre Pipeline eine „Genau einmal“-Verarbeitung von Datensätzen erfordert. 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 Ihrer Dataflow-Jobs möglicherweise 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, um Ihre Autoscaling-Einstellungen anzupassen. Weitere Informationen finden Sie unter Horizontales Autoscaling für Streamingpipelines anpassen. Bei Streamingjobs, die Streaming Engine verwenden, können Sie die Einstellungen für die automatische Anpassung 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, deaktivieren Sie es. Weitere Informationen finden Sie unter Horizontales Autoscaling.
Wenn Sie die optimale Anzahl der Threads für den Job kennen, legen Sie die
Anzahl der Threads pro Worker explizit mit der numberOfWorkerHarnessThreads oder
number_of_worker_harness_threads
Pipelineoption fest.
Lange laufende Jobs beenden
Für 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 Monitoringrichtlinien, 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 wiederholt fehlgeschlagene Arbeitselemente zu identifizieren.
- Informationen zum Monitoring von Pipelinefehlern finden Sie unter Anzahl der Worker-Fehlerlogs.
- 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 Pipelinelebenszyklus,
einschließlich der Parallelisierung durch Dataflow und der
verwendeten Optimierungsstrategien Dataflow-Jobs verwenden mehrere Worker-VMs und auf jedem Worker werden mehrere Threads ausgeführt. Elementbündel aus einer
PCollectionwerden an jeden Arbeitsthread 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.
- Befolgen Sie Best Practices für das Schreiben von Pipelinecode.
- Befolgen Sie die 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:
- Eine übermäßige Protokollierung kann die Leistung beeinträchtigen.
- Um das Logvolumen zu reduzieren, 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 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, der Umstrukturierung von Pipelines 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 stabilen Zustand und bei der Verarbeitung eines großen Backlogs, um eine Crash-Wiederherstellung 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
dataflow-ordered-processing
GitHub-Repository.