Replizieren Sie kontinuierlich Änderungen von einer OLTP-Datenbank (z. B. Oracle, PostgreSQL, MySQL) mit geringer Latenz nach BigQuery.
→Verwenden Sie Datastream, um Change Data Capture (CDC) durchzuführen. Konfigurieren Sie es so, dass Änderungen direkt an BigQuery gestreamt werden, das diese mithilfe seiner `MERGE`-Funktionalität anwendet.
Warum: Datastream ist ein verwalteter, serverloser CDC-Dienst, der die Datenbankreplikation in Echtzeit vereinfacht, ohne dass benutzerdefinierte Pipelines oder eine erhebliche Last der Quelldatenbank erforderlich sind.
Referenz↗
Eine Dataflow-Streaming-Pipeline muss trotz einiger Stunden verspätet eintreffender Ereignisse genaue ereigniszeitgesteuerte Fensterergebnisse liefern.
→Konfigurieren Sie Ereigniszeitfenster mit `allowedLateness`, um die Verzögerung zu berücksichtigen. Verwenden Sie Trigger mit frühen Auslösungen für vorläufige Ergebnisse und akkumulierende ausgelöste Bereiche, um verspätete Daten einzubeziehen.
Warum: Das Dataflow-Modell aus Watermarks, Triggern und erlaubter Verspätung bietet ein robustes Framework, um Vollständigkeit und Latenz beim Umgang mit unsortierten Daten in Einklang zu bringen.
Eine Dataflow-Pipeline, die nach BigQuery schreibt, erlebt Duplikate nach Neustarts oder vorübergehenden Fehlern.
→Verwenden Sie den BigQuery Storage Write API Sink (`STORAGE_WRITE_API`) mit der Methode `at-least-once` (Standard, früher `STREAMING_INSERTS`) oder `exactly-once` (`COMMITTED`-Modus).
Warum: Die Storage Write API im `COMMITTED`-Modus bietet integrierte Exactly-Once-Semantik für das Streaming, wodurch die Notwendigkeit einer benutzerdefinierten Deduplizierungslogik entfällt.
Nehmen Sie Daten von einer paginierten, ratenbegrenzten REST-API mit Dataflow auf.
→Verwenden Sie eine `SplittableDoFn`, um die paginierte Quelle parallel zu verarbeiten. Implementieren Sie Ratenbegrenzungslogik (z. B. mithilfe eines Guava RateLimiters) und exponentielles Backoff für Wiederholungen innerhalb der DoFn.
Warum: Eine `SplittableDoFn` ermöglicht ein dynamisches Neuausbalancieren der Arbeit. Die Kombination mit Ratenbegrenzungs- und Wiederholungslogik schafft ein robustes und effizientes Muster für die Handhabung externer APIs.
Ein einzelner Datenstrom muss in mehrere Ziele geschrieben werden (z. B. BigQuery, Bigtable, Cloud Storage).
→Wenden Sie in einer einzigen Dataflow-Pipeline nach der anfänglichen Verarbeitung mehrere `PTransform`-Writer auf dieselbe endgültige `PCollection` an.
Warum: Das Fan-Out-Muster ist hocheffizient, da die Daten nur einmal verarbeitet werden. Es vermeidet die Kosten und Komplexität, die beim Ausführen mehrerer separater Pipelines, die aus derselben Quelle lesen, entstehen.
Ein Hochvolumen-Stream muss durch einen Join mit einer sich langsam ändernden Dimensionstabelle (z. B. Benutzerprofile) angereichert werden, die periodisch aktualisiert wird.
→Verwenden Sie das Side-Input-Muster in Dataflow. Laden Sie die Dimensionstabelle als `PCollectionView`. Konfigurieren Sie einen periodischen Trigger, um den Side-Input nach einem Zeitplan zu aktualisieren und Pipeline-Neustarts zu verhindern.
Warum: Side-Inputs senden die Dimensionsdaten an alle Worker für schnelle In-Memory-Lookups, wodurch API/DB-Aufrufe pro Element vermieden werden. Die periodische Aktualisierung verarbeitet Updates effizient.
Dataproc-Cluster-Workloads variieren erheblich, was entweder zu Überprovisionierung oder Unterperformance führt.
→Erstellen Sie einen Dataproc-Cluster mit einer Autoscaling-Richtlinie. Definieren Sie die minimale/maximale Anzahl primärer und sekundärer Worker. Die Richtlinie skaliert den Cluster basierend auf YARN-Metriken.
Warum: Autoscaling optimiert Kosten, indem es Cluster-Ressourcen an die Job-Nachfrage anpasst, bei hohen Lasten hochskaliert und in Leerlaufzeiten herunterskaliert.
Eine Dataflow-Pipeline erfordert benutzerdefinierte Binärdateien, proprietäre Bibliotheken oder spezifische Versionen, die nicht in Standard-Worker-Images enthalten sind, und muss in einer VPC ohne Internetzugang ausgeführt werden.
→Erstellen Sie ein benutzerdefiniertes Container-Image mit allen vorinstallierten Abhängigkeiten. Pushen Sie das Image in Artifact Registry. Stellen Sie die Pipeline mithilfe eines Flex-Templates bereit, das auf den benutzerdefinierten Container verweist.
Warum: Flex Templates mit benutzerdefinierten Containern bieten vollständige Kontrolle über die Laufzeitumgebung und Abhängigkeiten, was für Offline- oder spezialisierte Umgebungen entscheidend ist.
Ein Dataflow- oder Spark-Job, der eine `GroupByKey` durchführt, ist langsam, weil einige Schlüssel unverhältnismäßig viele Werte haben (ein "Hot Key").
→Implementieren Sie eine zweistufige Aggregation (Key Salting). Hängen Sie zuerst ein zufälliges Suffix an den Schlüssel an, um den Hot Key auf mehrere Worker aufzuteilen. Aggregieren Sie teilweise. Zweitens entfernen Sie das Suffix und aggregieren die Teilergebnisse.
Warum: Diese Fanout-Technik zerlegt die Arbeit für den Hot Key manuell, wodurch er parallel verarbeitet und der Engpass überwunden werden kann.
Eine Streaming-Pipeline darf nicht aufgrund fehlerhafter Datensätze fehlschlagen. Ungültige Datensätze müssen für die Analyse isoliert werden, ohne die Verarbeitung anzuhalten.
→Verwenden Sie in einer `DoFn` einen Try-Catch-Block für die Analyse. Verwenden Sie eine Multi-Output-DoFn mit `TupleTag`, um gültige Datensätze zum Hauptausgang und ungültige Datensätze (mit Fehlerkontext) zu einem separaten Fehlerausgang zu leiten. Leiten Sie die Fehler-PCollection an ein Dead-Letter-Ziel wie ein Pub/Sub-Thema oder eine BigQuery-Tabelle weiter.
Warum: Dieses Muster bietet Resilienz, indem es fehlerhafte Daten isoliert, Pipeline-Fehler verhindert und sicherstellt, dass fehlgeschlagene Datensätze zur Fehlerbehebung und erneuten Verarbeitung erfasst werden.