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

b4wnujal  于 2021-06-21  发布在  Flink
关注(0)|答案(1)|浏览(505)

我目前正在处理flink中的一个问题,其中我必须计算三个不同的滑动窗口的聚合函数,这些滑动窗口的大小分别为7天、14天和1个月。据我所知,我必须运行三个不同的消费者平行具有上述窗口大小。有没有一种方法可以为一个数据流实现三个滑动窗口,全部使用一个用户代码?使用flink实现这一点的一些代码或参考是非常有用的。
我所知道的:消费者1在7天大小的滑动窗口上计算消费者2在14天大小的滑动窗口上计算,以此类推。我想要的是:consumer1为一个数据流同时计算所有这些滑动窗口。
有没有可能在Flink实现这一点?

yxyvkwin

yxyvkwin1#

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

相关问题