使用广播状态使用假消息强制关闭窗口

x4shl7ld  于 2021-06-24  发布在  Flink
关注(0)|答案(1)|浏览(266)

说明:
目前我正在使用物联网设置flink。基本上,设备正在发送数据,例如(设备id、设备类型、事件时间戳等),我无法控制消息何时发送。然后,我按设备id和设备类型对steam进行键控,以预生成聚合。我想使用事件时间,因为这是确保定时器设置触发在一个确定性的性质给予失败。然而,考虑到这并不总是一个高吞吐量的流,一个窗口可以打开10分钟的聚合周期,但是直到大约40分钟后它的下一个点才会出现。虽然计算最终会完成,但输出我想要的结果却非常晚。
因此,我的工作是创建一个额外的外部源,它除了发送假消息之外什么都不做。通过让这些假消息与我的10分钟聚合周期保持一致,即使设备没有发送任何数据,事件时间窗口也会有一些东西迫使窗口关闭。这里的关键部分是使所有并行示例/操作符都有可能访问这个假消息,因为我需要用这个假消息关闭所有窗口。我认为广播状态可能是实现这一目标的最合适的方式:“广播状态在函数的所有并行示例中复制,通常在有两个流的情况下使用,一个常规数据流和一个提供规则、模式的控制流,或其他配置消息
问题:
广播状态是确保所有并行示例(如windows)接收到我的假消息的最佳方法吗?
一旦运营商通过广播状态访问了这个假消息,那么这个假消息可以用来提前事件时间水印吗?

cig3rfwq

cig3rfwq1#

你可以按照你的建议,用广播状态来实现这一点,但我不认为这是最好的解决方案。
在理想的情况下,我建议您安排设备偶尔发送keepalive消息,但假设这不可能,我认为定制触发器在这里可以很好地工作。您可以扩展eventtimetrigger,以便除了通过

ctx.registerEventTimeTimer(window.maxTimestamp());

您还可以创建一个处理时间计时器作为回退,如果在处理时间计时器启动时窗口仍然存在,则启动该窗口。
我之所以推荐这种方法,是因为它更简单,更直接地满足特定的需求。使用广播状态方法,您必须为这些消息引入源,添加广播状态描述符和流,为非广播流添加特殊的假水印(设置为watermark.max\u watermark),连接广播流和非广播流,并实现broadcastprocessfunction(这可能不起任何作用)等。它是分布在几个不同运营商之间的许多移动部件。

相关问题