首页 > 解决方案 > 单个数据流上的多个滑动窗口

问题描述

我目前正在解决 Flink 中的一个问题,其中我必须计算窗口大小为 7 天、14 天和 1 个月的三个不同滑动窗口的聚合函数。据我了解,我必须同时运行三个具有上述窗口大小的不同消费者。有没有办法使用单个消费者代码为单个数据流实现三个滑动窗口?使用 Flink 实现这一点的一些代码或参考是非常可观的。

我所知道的:消费者 1 在大小为 7 天的滑动窗口上进行计算,消费者 2 在大小为 14 天的滑动窗口上进行计算,依此类推。我想要的是: 消费者 1 同时为单个数据流计算所有这些滑动窗口

是否可以在 Flink 中实现这一点?

标签: apache-flinksliding-window

解决方案


各个窗口可以共享一个 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(),因此如果您希望窗口与月份边界对齐,我想您必须弄清楚这部分。


推荐阅读