2017-11-21 18 views
0

Ich bewerte Flink für ein Streaming-Analyse-Szenario und habe nicht genügend Informationen darüber gefunden, wie eine Art von ETL-Setup in einem Legacy-System durchgeführt werden kann System heute.Kombination von Streams mit niedriger Latenz mit mehreren Meta-Datenströmen in Flink

Ein sehr gängiges Szenario ist, dass wir eingegeben haben, langsam Durchsatz, Meta-Datenströme, die wir für die Anreicherung auf einen hohen Durchsatz Datenströme, etwas in der Linie von verwenden möchten:

enter image description here

Diese wirft zwei Fragen bezüglich Flink auf: Wie bereichert man einen sich schnell bewegenden Stream mit sich langsam aktualisierenden Streams, bei denen sich die Zeitfenster überlappen, aber nicht gleich sind (Meta-Daten können tagelang leben, während Daten für Minuten existieren)? Und wie verbindet man effizient mehrere (bis zu 10) Streams mit Flink, sagen wir einen Datenstrom und neun verschiedene Anreicherungsströme?

Ich bin mir bewusst, dass ich mein ETL-Szenario mit nicht gefensterten externen ETL-Caches, zum Beispiel mit Redis (was wir heute verwenden) erfüllen kann, aber ich wollte sehen, welche Möglichkeiten Flink bietet.

Antwort

2

Flink hat mehrere Mechanismen, die zur Anreicherung verwendet werden können.

Ich gehe davon aus, dass alle Streams einen gemeinsamen Schlüssel teilen, der verwendet werden kann, um die entsprechenden Elemente zu verbinden.

Der einfachste Ansatz ist wahrscheinlich eine RichFlatmap zu verwenden und statische Anreicherungsdaten in seiner open() - Methode zu laden (docs about rich functions). Dies ist nur geeignet, wenn die Anreicherungsdaten statisch sind oder wenn Sie bereit sind, den Anreicherungsjob neu zu starten, wenn Sie die Anreicherungsdaten aktualisieren möchten.

Für die anderen unten beschriebenen Ansätze sollten Sie die Anreicherungsdaten als verwalteten, verschlüsselten Status speichern (siehe docs about working with state in Flink). Dies ermöglicht es Flink, Ihren Anreicherungsjob im Falle von Fehlern wiederherzustellen und fortzusetzen.

Angenommen, Sie möchten die Anreicherungsdaten tatsächlich streamen, dann ist RichCoFlatmap geeigneter. Dies ist ein statusbehafteter Operator, mit dem zwei verbundene Streams zusammengeführt oder verbunden werden können. Mit einer RichCoFlatmap haben Sie jedoch keine Möglichkeit, das Timing der Stream-Elemente zu berücksichtigen. Wenn es darum geht, dass ein Strom zum Beispiel vor oder hinter dem anderen fließt und wollen, dass die Bereicherung wiederholbar und deterministisch durchgeführt wird, dann ist die Verwendung eines CoProcessFunction der richtige Ansatz.

Sie finden ein detailliertes Beispiel plus Code in der Apache Flink training materials.

Wenn Sie viele Streams (z. B. 10) zu verbinden haben, können Sie eine Reihe dieser zwei Eingabe CoProcessFunction-Operatoren kaskadieren, aber das wird, zugegebenermaßen, ziemlich peinlich an einem Punkt. Eine Alternative wäre, einen Vereinigungsoperator zu verwenden, um alle Metadatenströme zu kombinieren (beachten Sie, dass dies erfordert, dass alle Ströme den gleichen Typ aufweisen), gefolgt von RichCoFlatmap oder CoProcessFunction, die diesen vereinheitlichten Anreicherungsstrom mit dem Primärstrom verbindet .

Update:

Flink der Tabelle und SQL-APIs können auch für Strom Anreicherung verwendet werden, und Flink 1.4 erweitert diese Unterstützung durch Hinzufügen von Streaming-Zeit-Fensterinnen verbindet. Siehe Table API joins und SQL joins.Beispiel:

In diesem Beispiel werden Bestellungen mit den entsprechenden Sendungen zusammengeführt, wenn die Sendung innerhalb von 4 Bestellungen nach der Bestellung eingegangen ist.

+0

Danke! Ich war in der Lage, meinen Anwendungsfall mit einer Reihe benutzerdefinierter CoProcessFunctions und benutzerdefinierter Zustandsverwaltung zu lösen, im Wesentlichen zwei Dinge zu lösen, die Flink in der DSL-API fehlt: zwei Streams mit unterschiedlichen Fenstergrößen zu verbinden (ich verwalte die Join-Logik) und true Schiebefenster (dh nicht nur überlappende Taumelfenster, die leider von der Flink-Gemeinschaft als Schiebefenster bezeichnet werden). Ich glaube jedoch, dass es in Jira Tickets für beide Funktionen gibt. – averas

+0

Froh, dass Sie eine Lösung gefunden haben. Ich habe ein Update zur Verwendung der Tabellen- und SQL-APIs für zeitfensterorientierte Joins hinzugefügt, die möglicherweise besser zu Ihrem Anwendungsfall passen. Dies kommt in Flink 1.4, das später in dieser Woche veröffentlicht werden soll. –

Verwandte Themen