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.
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
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. –