描述:
目前,我正在研究将 Flink 与 IOT 设置一起使用。从本质上讲,设备正在发送诸如(device_id,device_type,event_timestamp等(之类的数据,我无法控制消息的发送时间。然后,我通过device_id和device_type来抠动蒸汽以形成聚合。我想使用事件时间,以确保在失败的情况下以确定性性质设置触发的计时器。但是,鉴于这并不总是一个高吞吐量流,可以打开一个窗口 10 分钟的聚合周期,但直到大约 40 分钟后才打开下一个点。尽管计算最终会完成聚合,但它会非常晚地输出我想要的结果。
因此,我的解决方法是创建一个额外的外部源,除了发送虚假消息外,该源什么都不做。通过根据我的 10 分钟聚合周期将这些虚假消息抽出,即使设备没有发送任何数据,事件时间窗口也会有一些东西来强制关闭窗口。这里的关键部分是使所有并行实例/运算符都可以访问此假消息,因为我需要使用此单个假消息关闭所有窗口。我在想广播状态可能是实现此目标的最合适方式:"广播状态跨函数的所有并行实例进行复制,并且通常可用于您有两个流的地方,一个常规数据流和一个提供规则、模式或其他配置消息的控制流。报价来源
问题:
- 广播状态是确保所有并行实例(例如窗口(收到我的假消息的最佳方法吗?
- 一旦操作员可以通过广播状态访问此假消息,是否可以使用此假消息来推进事件时间水印?
您可以按照您提出的思路使用广播状态进行这项工作,但我不相信这是最好的解决方案。
在理想的世界中,我建议您安排设备偶尔发送激活消息,但假设这是不可能的,我认为自定义触发器在这里会很好用。您可以扩展事件时间触发器,以便除了事件时间计时器之外,它还通过
ctx.registerEventTimeTimer(window.maxTimestamp());
您还可以创建一个处理时间计时器作为回退,如果该窗口在处理时间计时器触发时仍然存在,则 FIRE 该窗口。
我推荐这种方法,因为它更简单,更直接地满足特定需求。使用广播状态方法,您必须为这些消息引入源,添加广播状态描述符和流,为非广播流添加特殊的假水印(设置为 Watermark.MAX_WATERMARK(,连接广播和非广播流并实现 BroadcastProcessFunction(可能实际上什么都不做(等。它有很多活动部件分布在几个不同的运营商身上。