Apache flink Flink:为流的每个传入元素计算窗口

Apache flink Flink:为流的每个传入元素计算窗口,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我有一系列以下形式的预订要素: Booking(id=B1, driverId=D1, time=t1, location=l1) Booking(id=B2, driverId=D2, time=t2, location=l2) 我需要找到过去15分钟内每个地点的预订数量。但是,该窗口应评估任何新的预订来的位置 大致如下: Assuming `time` field is set as timestamp of record bookingStream.keyBy(b=>b.locat

我有一系列以下形式的预订要素:

Booking(id=B1, driverId=D1, time=t1, location=l1)
Booking(id=B2, driverId=D2, time=t2, location=l2)
我需要找到过去15分钟内每个地点的预订数量。但是,该窗口应评估任何新的预订来的位置

大致如下:

Assuming `time` field is set as timestamp of record
bookingStream.keyBy(b=>b.location).window(Any window of 15mins).trigger(triggerFunction)
除了不应在15分钟结束时评估
触发功能
,而应在任何预订到达某个位置时评估
,并且
从新到达预订的时间戳发出最近15分钟的预订计数

方法:

使用RichMap功能,将位置预订的优先级队列维护为托管状态(ValueState),时间戳作为预订的优先级。对于每个到达的元素,首先将其添加到状态,并从当前到达的元素中删除15分钟之前的元素。将优先级队列中剩余元素的计数发送给收集器


这是正确的方法还是可以通过更好地使用其他flink构造来实现。

如果您在基于堆的状态后端上运行,那么您所建议的应该表现得相当好。但是使用RocksDB,您必须对每次访问的优先级队列进行序列化/反序列化,这可能会非常痛苦

一种可能在RocksDB上表现更好的方法是将当前计数和最早的时间戳保持在ValueState中,并将预订集保持在ListState中。RocksDB状态后端可以在不经过ser/de的情况下附加到ListState,因此您只需在最早的元素太旧时反序列化并重新序列化整个列表