Apache Flink:即使给定聚合没有输入记录到达,基于键控状态在 Flink 中发出输出记录 window
Apache Flink: Emit output records in Flink based on keyed state even if no input records have arrived for a given aggregation window
我正在尝试将 Apache Flink 用于 IoT 应用程序。我有一堆设备可以处于几种状态之一。当设备更改状态时,它会发出一条消息,其中包含事件时间戳和它更改到的状态。对于一台设备,这可能看起来像这样:
{Device_id: 1, Event_Timestamp: 9:01, 状态: STATE_1}
{Device_id: 1, Event_Timestamp: 9:03, 状态: STATE_2}
对于每台设备,我需要生成一个五分钟的总计,用于计算设备在给定五分钟内在每个状态下花费的时间 window。为了做到这一点,我计划使用键控状态来存储每个设备的最后状态更新,这样我就知道设备在聚合开始时处于什么状态window。例如,假设 ID 为“1”的设备有一个键控状态值,表示它在 8:58 进入 "STATE_2"。然后 9:00 - 9:05 window 的聚合输出会像这样(基于上面的两个示例事件):
{Device_id:1,时间戳:9:00,状态:STATE_1,持续时间:120 秒}
{Device_id:1,时间戳:9:00,状态:STATE_2,持续时间:180 秒}
我的问题是:如果 window 有一个事件,Flink 只会为给定的 device_id 打开一个 window。这意味着如果设备超过 5 分钟没有更改状态,则没有记录将进入流,因此 window 将不会打开。但是,我需要发出一条记录,表明设备在整个五分钟内都处于基于键控状态中存储的当前状态的任何状态。例如,Flink 应该为 9:05-9:10 发出一条记录,表明 ID 为“1”的设备在 "STATE_2" 中花费了全部 300 秒。
有没有办法输出每台设备在给定状态下花费五分钟聚合时间的记录window即使状态在这五分钟内没有改变,因此,设备不发送任何事件?如果没有,是否有任何解决方法可以用来获取我的应用程序所需的输出事件?
实现此目的的一种直接方法是使用 ProcessFunction 而不是窗口化。您可以保留对您的应用程序方便的任何键控状态,并使用计时器触发生成定期报告。
我正在尝试将 Apache Flink 用于 IoT 应用程序。我有一堆设备可以处于几种状态之一。当设备更改状态时,它会发出一条消息,其中包含事件时间戳和它更改到的状态。对于一台设备,这可能看起来像这样:
{Device_id: 1, Event_Timestamp: 9:01, 状态: STATE_1}
{Device_id: 1, Event_Timestamp: 9:03, 状态: STATE_2}
对于每台设备,我需要生成一个五分钟的总计,用于计算设备在给定五分钟内在每个状态下花费的时间 window。为了做到这一点,我计划使用键控状态来存储每个设备的最后状态更新,这样我就知道设备在聚合开始时处于什么状态window。例如,假设 ID 为“1”的设备有一个键控状态值,表示它在 8:58 进入 "STATE_2"。然后 9:00 - 9:05 window 的聚合输出会像这样(基于上面的两个示例事件):
{Device_id:1,时间戳:9:00,状态:STATE_1,持续时间:120 秒}
{Device_id:1,时间戳:9:00,状态:STATE_2,持续时间:180 秒}
我的问题是:如果 window 有一个事件,Flink 只会为给定的 device_id 打开一个 window。这意味着如果设备超过 5 分钟没有更改状态,则没有记录将进入流,因此 window 将不会打开。但是,我需要发出一条记录,表明设备在整个五分钟内都处于基于键控状态中存储的当前状态的任何状态。例如,Flink 应该为 9:05-9:10 发出一条记录,表明 ID 为“1”的设备在 "STATE_2" 中花费了全部 300 秒。
有没有办法输出每台设备在给定状态下花费五分钟聚合时间的记录window即使状态在这五分钟内没有改变,因此,设备不发送任何事件?如果没有,是否有任何解决方法可以用来获取我的应用程序所需的输出事件?
实现此目的的一种直接方法是使用 ProcessFunction 而不是窗口化。您可以保留对您的应用程序方便的任何键控状态,并使用计时器触发生成定期报告。