2017-09-02 59 views
7

我有兩個要合併的數據流。問題是一個數據流的頻率比另一個高得多,並且有時候一個數據流根本沒有接收到事件。是否有可能使用來自一個流的最後一個事件並將其與每個即將到來的事件的另一個流加入?無論窗口時間如何,在Apache Flink中合併兩個流

我發現的唯一解決方案是使用連接函數,但您必須指定一個公共窗口,您可以在其中應用連接函數。這是未達到的窗口,當一個流沒有收到任何事件。

是否有可能將連接函數應用於來自任何一個流或另一個流的每個事件,並維護上次使用事件的狀態並將該事件用於連接函數?

在此先感謝您提供任何有用的提示!

回答

5

您想要使用Flink的ConnectedStream s,並使用RichCoFlatMapFunctionCoProcessFunction。這兩者中的任何一個都可以讓您保持管理狀態(即不常更新流中的最後一個元素),並以更快的流將其加入。 CoProcessFunction增加了與定時器一起工作的能力,您應該使用它來清除過期的鍵的狀態(如果相關)。

在Flink培訓網站上有關於實施這種加入的練習:Low-latency Event Time Join

更新:在Flink 1.5(截至2018年2月尚未發佈)中,SQL庫has an implementation of non-windowed stream joins。它以Flink狀態存儲記錄,使用MapState<Long, Record>其中Long是時間戳,並通過迭代這些映射並比較時間戳來加入。與來自培訓的例子(參見上面的鏈接)相比,這具有僅在需要時反序列化記錄的優點。

+0

謝謝!這正是我所期待的! – FLoppix

+0

@DavidAnderson相反,加入兩個快速(頻繁)流時,示例會不同嗎?你會改變什麼? – Beckham