Несколько скользящих окон в одном потоке данных - PullRequest
0 голосов
/ 26 июня 2019

В настоящее время я работаю над проблемой во Flink, в которой мне придется вычислять агрегатные функции для трех разных скользящих окон с размерами окна 7 дней, 14 дней и 1 месяц. Из того, что я понял, мне пришлось бы запускать трех разных потребителей параллельно с указанными выше размерами окон. Есть ли способ реализовать три скользящих окна для одного потока данных, используя один код потребителя? Некоторый код или ссылка для реализации этого с использованием Flink очень заметны.

Что я знаю: потребитель 1 рассчитывает на скользящее окно размером 7 дней потребитель 2 вычисляет по скользящему окну размером 14 дней и так далее. Что я хочу: потребитель 1 вычисляет все эти скользящие окна одновременно для одного потока данных .

Возможно ли реализовать это во Flink?

1 Ответ

2 голосов
/ 28 июня 2019

Различные окна могут совместно использовать один поток, созданный одним потребителем 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 () не существует, поэтому, если вы хотите, чтобы окна были выровнены по границам месяца, я думаю, вам придется разобраться с этой частью.

...