Apache Flink 加入流
Apache Flink join streams
我想在 Flink 中加入两个流。条件如下:
每一个都有一个唯一的id作为连接点。
在两个流中,每个键只会出现一次。
流中的键最多间隔 10 秒。
没有事件时间,但我可以同时使用处理时间或摄取时间。此限制很重要,因为不允许我使用仅适用于事件时间的间隔连接。
最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
,前提是您安排两个流具有相同的类型。
我想在 Flink 中加入两个流。条件如下:
每一个都有一个唯一的id作为连接点。
在两个流中,每个键只会出现一次。
流中的键最多间隔 10 秒。
没有事件时间,但我可以同时使用处理时间或摄取时间。此限制很重要,因为不允许我使用仅适用于事件时间的间隔连接。
最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
,前提是您安排两个流具有相同的类型。