带Flink的大型Windows流加入

时间:2019-10-01 05:13:49

标签: apache-flink flink-streaming

我需要基于一个密钥加入两个事件源。事件之间的间隔可能长达1年(即,id1的event1可能会在今天到达,而来自第二个事件源的id1的相应event2可能会在一年后到达)。假设我只想流式传输加入的事件输出。

我正在探索在RocksDB后端使用Flink的选项(我遇到了一些表API,这些API似乎适合我的用例)。我找不到执行这种长窗口连接的引用体系结构。我希望系统每天处理大约2亿个事件。

问题:

  1. 使用Flink进行这种长窗连接是否有明显的局限性/陷阱?

  2. 有关处理这种长窗口联接的任何建议

相关:我还在探索将Lambda与DynamoDB作为进行流连接(Related Question)的状态。如果此信息相关,我将使用托管AWS服务。

1 个答案:

答案 0 :(得分:1)

此用例面临的明显挑战是:连接窗口的大小很大,一年,并且摄取率高,这可能导致巨大状态大小。

这里的主要问题是这是否为1:1连接,即流A中的记录是否与流B中的记录完全(或最多)连接一次。这很重要,因为如果您有1 :1联接,您可以将一条记录与另一条记录联接起来,从而立即从该状态中删除一条记录,而无需全年保留该记录。因此,您的州仅存储尚未加入的记录。假设大多数记录已快速加入,则您的状态可能会保持很小。

如果您具有1:1联接,则Flink的Table API(和SQL)的时间窗口联接以及DataStream API的Interval联接不是您想要的。它们被实现为m:n连接,因为每个记录可能与另一个输入的一个以上记录连接。因此,他们会在整个窗口间隔内保留 all 记录,即在您的用例中保留一年。如果您具有1:1联接,则应将自己作为KeyedCoProcessFunction来实现。

如果每条记录可以在一年内多次加入,则无法缓冲这些记录。在这种情况下,您可以使用Flink的Table API(和SQL)的时间窗口联接以及DataStream API的Interval联接。