Apache Flink 加入流

Apache Flink join streams

我想在 Flink 中加入两个流。条件如下:

最simple/efficient的方法是什么?

有一个 exercise in the online Flink training 涵盖了这个案例,因此您可以将其作为起点。

那里提供的解决方案实现了这种一对一连接,其中每个键恰好出现一次,如 RichCoFlatMap

在这些情况下,重要的是您要小心不要泄漏状态——如果对于某些键,其中一个预期事件从未到达,则此实现将执行此操作,因为不匹配的事件将永远处于状态。由于您知道事件之间的间隔永远不会超过 10 秒,因此您可以将其实现为 KeyedCoProcessFunction,并使用处理时间计时器来清除任何可能因丢失事件而延迟的状态。这 other exercise on expiring state does something similar. Or you could rely on state TTL 清除任何未使用的状态。

Flink 确实通过其更高级别的 API 支持多种连接——windowed 连接、间隔连接、时间连接等——但对于这种特定类型的连接,none这是一个很好的匹配,具有流程功能的低级实现很容易实现并且性能非常好。

更新:

您可以使用计数 windows 实现此功能,计数为 2。但是,如果缺少任何事件,你就会在周围晃来晃去 windows。这可以通过在超时后关闭 windows 的自定义触发器来解决。

或者您可以使用会话 windows 来实现,方法是指定一个大于 10 秒的会话间隙。但是,会话 window 的 ProcessWindowFunction 直到发生间隙后才会被调用,因此只有在等待间隙后才会生成连接结果。我再次认为您可以使用自定义触发器解决此问题。

请注意,这些基于 window 的解决方案中的任何一个都取决于首先将两个流合并为一个。您可以为此使用 union,前提是您安排两个流具有相同的类型。