我正在尝试将apache flink用于物联网应用程序。我有一堆设备,可以在几个州之一。当设备更改状态时,它会发出一条消息,其中包含事件时间戳和更改到的状态。对于一个设备,可能如下所示:
{设备id:1,事件时间戳:9:01,状态:状态1}
{设备id:1,事件时间戳:9:03,状态:状态2}
对于每个设备,我需要为给定的5分钟窗口中设备在每个状态下花费的时间量生成一个5分钟的聚合。为了做到这一点,我计划使用keyed state来存储每个设备的上一次状态更新,以便知道设备在聚合窗口开始时处于什么状态。例如,假设id为“1”的设备有一个键控状态值,表示它在8:58进入“状态2”。那么9:00-9:05窗口的聚合输出如下所示(基于上面的两个示例事件):
{设备id:1,时间戳:9:00,状态:状态1,持续时间:120秒}
{设备id:1,时间戳:9:00,状态:状态2,持续时间:180秒}
我的问题是:flink只会为给定的设备id打开一个窗口,如果该窗口有一个事件。这意味着,如果一个设备在5分钟内没有改变状态,没有记录将进入流,因此窗口将不会打开。但是,我需要发出一个记录,说明设备在当前状态下花费了整整五分钟,而当前状态是基于键控状态下存储的内容。例如,flink应该发出一条9:05-9:10的记录,表明id为“1”的设备在“state\u 2”中花费了全部300秒。
有没有一种方法可以输出每个设备在5分钟聚合窗口内处于给定状态所花费的时间量的记录,即使状态在这5分钟内没有改变,因此,设备不发送事件?如果没有,是否有任何解决方法可用于获取应用程序所需的输出事件?
1条答案
按热度按时间zour9fqk1#
实现这一点的简单方法是使用processfunction,而不是窗口化。您可以保留对应用程序方便的任何键控状态,并使用计时器触发生成定期报告。