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

Apache flink 单个数据流上的多个滑动窗口,apache-flink,sliding-window,Apache Flink,Sliding Window,我目前正在处理Flink中的一个问题,其中我必须为三个不同的滑动窗口计算聚合函数,窗口大小分别为7天、14天和1个月。 据我所知,我必须同时运行三个具有上述窗口大小的不同消费者。有没有一种方法可以使用一个用户代码为一个数据流实现三个滑动窗口? 使用Flink实现这一点的一些代码或参考非常值得欣赏 据我所知: 消费者1通过7天大小的滑动窗口进行计算 消费者2在大小为14天的滑动窗口上进行计算 等等 我想要的是: 消费者1为单个数据流同时计算所有这些滑动窗口 有可能在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(...)
consumer=new FlinkKafkaConsumer(“主题”,new topicSchema(),kafkapprops);
流=环境添加源(消费者);
w1=流。键比(键)
.window(slidengEventTimeWindows.of(Time.days(7),Time.days(1))
.过程(……)
w2=流.keyBy(键)
.window(slidengEventTimeWindows.of(Time.days(14),Time.days(1))
.过程(……)
或者,为了提高效率,您可以这样构造它:

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(...)
consumer=new FlinkKafkaConsumer(“主题”,new topicSchema(),kafkapprops);
流=环境添加源(消费者);
daybayday=stream.keyBy(key)
.window(tumblingeventimeewindows.of(Time.days(1))
.过程(……)
w1=daybaye.keyBy(键)
.window(slidengEventTimeWindows.of(Time.days(7),Time.days(1))
.过程(……)
w2=daybaye.keyBy(键)
.window(slidengEventTimeWindows.of(Time.days(14),Time.days(1))
.过程(……)

但是请注意,没有Time.months(),因此如果您希望窗口与月份边界对齐,我想您必须找出这一部分。

各个窗口可以共享一个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(...)
consumer=new FlinkKafkaConsumer(“主题”,new topicSchema(),kafkapprops);
流=环境添加源(消费者);
w1=流。键比(键)
.window(slidengEventTimeWindows.of(Time.days(7),Time.days(1))
.过程(……)
w2=流.keyBy(键)
.window(slidengEventTimeWindows.of(Time.days(14),Time.days(1))
.过程(……)
或者,为了提高效率,您可以这样构造它:

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(...)
consumer=new FlinkKafkaConsumer(“主题”,new topicSchema(),kafkapprops);
流=环境添加源(消费者);
daybayday=stream.keyBy(key)
.window(tumblingeventimeewindows.of(Time.days(1))
.过程(……)
w1=daybaye.keyBy(键)
.window(slidengEventTimeWindows.of(Time.days(7),Time.days(1))
.过程(……)
w2=daybaye.keyBy(键)
.window(slidengEventTimeWindows.of(Time.days(14),Time.days(1))
.过程(……)

但是请注意,没有时间。months(),因此,如果您希望窗口与月份边界对齐,我想您必须找出这一部分。

为什么要在一个操作符中同时处理所有窗口?我有一个数据流,需要对其执行许多操作。我想在最后一天、上周等中找到受欢迎的方法。正确的方法是什么用一个流?为什么要在一个操作员中同时处理所有窗口?我有一个数据流,需要对其执行许多操作。我想在最后一天、上周等中找到流行的。用一个流处理所有这些操作的正确方法是什么?