单个数据流上的多个滑动窗口

时间:2019-06-26 11:32:51

标签: apache-flink sliding-window

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

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

可以在Flink中实现吗?

1 个答案:

答案 0 :(得分:2)

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