Apache Flink:即使给定聚合窗口没有输入记录到达,也会根据键控状态在 Flink 中发出输出记录

Chr*_*ATX 1 iot apache-flink flink-streaming

我正在尝试将 Apache Flink 用于 IoT 应用程序。我有一堆可能处于多种状态之一的设备。当设备更改状态时,它会发出一条消息,其中包含事件时间戳和更改后的状态。对于一台设备,这可能如下所示:

{Device_id:1,Event_Timestamp:9:01,状态:STATE_1}

{Device_id:1,Event_Timestamp:9:03,状态:STATE_2}

对于每个设备,我需要为给定的五分钟窗口内设备在每个状态下花费的时间量生成一个五分钟的聚合。为了做到这一点,我计划使用键控状态来存储每个设备的最后状态更新,以便我知道设备在聚合窗口开始时处于什么状态。例如,假设 ID 为“1”的设备有一个键控状态值,表示它在 8:58 进入“STATE_2”。那么 9:00 - 9:05 窗口的聚合输出将如下所示(基于上面的两个示例事件):

{Device_id:1,时间戳:9:00,状态:STATE_1,持续时间:120 秒}

{Device_id:1,时间戳:9:00,状态:STATE_2,持续时间:180 秒}

我的问题是这样的:如果窗口有事件,Flink 只会为给定的 device_id 打开一个窗口。这意味着,如果设备超过 5 分钟没有更改状态,则不会有任何记录进入流,因此窗口不会打开。但是,我需要发出一条记录,表明设备在整个五分钟内处于基于密钥状态中存储的内容的当前状态。例如,Flink 应该发出一条 9:05-9:10 的记录,表明 id 为“1”的设备在“STATE_2”中花费了全部 300 秒。

有没有办法输出每个设备在五分钟聚合窗口中处于给定状态的时间量的记录,即使状态在这五分钟内没有改变,因此设备不发送任何事件?如果没有,是否有任何解决方法可以用来获取应用程序所需的输出事件?

Dav*_*son 5

实现此目的的一种直接方法是使用 ProcessFunction 而不是窗口。您可以保留对您的应用程序方便的任何键控状态,并使用计时器来触发生成定期报告。