说明:
当前,我正在将Flink与IOT设置一起使用。本质上,设备正在发送数据(例如device_id,device_type,event_timestamp等),并且我对邮件何时发送没有任何控制权。然后,我通过device_id和device_type来键入流以进行聚合。我想使用给定的事件时间,这可以确保设置的计时器在发生故障时以确定性触发。但是,由于这并不总是高吞吐量流,因此可以在10分钟的聚合时间内打开一个窗口,但是直到大约40分钟后才可以打开窗口。尽管计算将最终完成,但计算将非常晚地输出我想要的结果。
因此,为此,我的解决方法是创建一个额外的外部源,除了发送虚假消息外,该源不执行其他任何操作。通过按照我的10分钟汇总周期抽出这些虚假消息,即使设备没有发送任何数据,事件时间窗口也将具有迫使窗口关闭的功能。这里的关键部分是使所有并行实例/操作员都可以访问此伪造的消息,因为我需要用此伪造的消息关闭所有窗口。我当时以为,广播状态可能是实现此目标的最合适的方法:“广播状态是在函数的所有并行实例之间复制的,通常可能在有两个流,规则数据流和控制流并存的情况下使用服务规则,模式或其他配置消息。” Quote Source
问题:
答案 0 :(得分:0)
您可以按照建议的方式在广播状态下进行此操作,但我不认为这是最佳解决方案。
在理想情况下,我建议您安排设备发送偶尔的Keepalive消息,但是假设这不可能,我认为自定义触发器将在这里很好地工作。您可以扩展EventTimeTrigger,以便除了通过创建事件时间计时器之外,还可以通过
ctx.registerEventTimeTimer(window.maxTimestamp());
您还创建了一个处理时间计时器作为备用,如果触发该处理时间计时器时该窗口仍然存在,则将该窗口射击。
我推荐这种方法,因为它更简单并且更直接地解决了特定需求。使用广播状态方法,您将必须为这些消息引入源,添加广播状态描述符和流,为非广播流添加特殊的假水印(设置为Watermark.MAX_WATERMARK),连接广播和非广播流并实现BroadcastProcessFunction(可能实际上并没有做任何事情)等。很多活动部件分布在几个不同的运算符上。