2017-09-02 215 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