apache-flink - 单个数据流上的多个滑动窗口
问题描述
我目前正在解决 Flink 中的一个问题,其中我必须计算窗口大小为 7 天、14 天和 1 个月的三个不同滑动窗口的聚合函数。据我了解,我必须同时运行三个具有上述窗口大小的不同消费者。有没有办法使用单个消费者代码为单个数据流实现三个滑动窗口?使用 Flink 实现这一点的一些代码或参考是非常可观的。
我所知道的:消费者 1 在大小为 7 天的滑动窗口上进行计算,消费者 2 在大小为 14 天的滑动窗口上进行计算,依此类推。我想要的是: 消费者 1 同时为单个数据流计算所有这些滑动窗口。
是否可以在 Flink 中实现这一点?
解决方案
各个窗口可以共享一个 kafka 消费者产生的单个流,如下所示:
consumer = new FlinkKafkaConsumer<>("topic", new topicSchema(), kafkaProps);
stream = env.addSource(consumer);
w1 = stream.keyBy(key)
.window(SlidingEventTimeWindows.of(Time.days(7), Time.days(1))
.process(...)
w2 = stream.keyBy(key)
.window(SlidingEventTimeWindows.of(Time.days(14), Time.days(1))
.process(...)
或者为了更有效率,你可以这样构造它:
consumer = new FlinkKafkaConsumer<>("topic", new topicSchema(), kafkaProps);
stream = env.addSource(consumer);
dayByDay = stream.keyBy(key)
.window(TumblingEventTimeWindows.of(Time.days(1))
.process(...)
w1 = dayByDay.keyBy(key)
.window(SlidingEventTimeWindows.of(Time.days(7), Time.days(1))
.process(...)
w2 = dayByDay.keyBy(key)
.window(SlidingEventTimeWindows.of(Time.days(14), Time.days(1))
.process(...)
但是请注意,没有 Time.months(),因此如果您希望窗口与月份边界对齐,我想您必须弄清楚这部分。