我正在尝试将Apache Flink用于物联网应用程序。我有一堆设备可以处于几种状态之一。当设备更改状态时,它会发出一条消息,其中包含事件时间戳和它更改为的状态。对于一台设备,这可能如下所示:
{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 秒。
有没有办法输出每个设备在给定状态下花费的五分钟聚合窗口的时间记录,即使状态在这五分钟内没有变化,因此设备不发送任何事件?如果没有,我可以使用任何解决方法来获取应用程序所需的输出事件?
实现这一点的一个简单方法是使用 ProcessFunction 而不是窗口。您可以保留对应用程序方便的任何键控状态,并使用计时器触发生成定期报告。