Apache Flink KeyedStream после выяснения поведения оконного оператора - PullRequest
0 голосов
/ 21 сентября 2018

Я запрашиваю разъяснения о том, как именно Apache Flink (1.6.0) обрабатывает события из KeyedStreams после того, как события были отправлены через окно, и был применен какой-то оператор (например, Reduce () или Process ()).

Предполагая, что в кластере с одним узлом после выполнения оператора в оконном потоке с ключом остается один с точно 1 DataStreams или точно k DataStreams (где k количество уникальных значений для ключа)?

Для пояснения рассмотрите необходимость считывания событий из какого-либо источника, ключа путем некоторого k , отправки событий с ключами в некоторый оконный поток, уменьшения, а затем делать почти все остальное.Какой из двух приведенных ниже графиков будет фактически построен?

График A

                     |--------------|
                     |    source    |
                     | (DataStream) |
                     |--------------|
                            |
                       [all events]
                            |
                            v
                     |--------------|
                     |  key by( k ) |
                     | (KeyedStream)|
                     |--------------|
                   /         |        \
                 /           |          \
            [ k = 1 ]    [ k = 2 ]    [ k = 3 ]
             /               |               \
           /                 |                 \
         v                   v                   v
|------------------||------------------||------------------|
|  sliding window  ||  sliding window  ||  sliding window  |
| (WindowedStream) || (WindowedStream) || (WindowedStream) |
|------------------||------------------||------------------|
         |                   |                   |
     [ k = 1 ]           [ k = 2 ]           [ k = 3 ]
         |                   |                   |
         v                   v                   v
   |----------|        |----------|        |----------|
   |  reduce  |        |  reduce  |        |  reduce  |
   |----------|        |----------|        |----------|
         |                   |                   |
     [ k = 1 ]           [ k = 2 ]           [ k = 3 ]
         |                   |                   |
         v                   v                   v
  |--------------|    |--------------|    |--------------|
  |     foo      |    |     foo      |    |     foo      |
  | (DataStream) |    | (DataStream) |    | (DataStream) |
  |--------------|    |--------------|    |--------------|

График B

                     |--------------|
                     |    source    |
                     | (DataStream) |
                     |--------------|
                            |
                       [all events]
                            |
                            v
                     |--------------|
                     |  key by( k ) |
                     | (KeyedStream)|
                     |--------------|
                   /         |        \
                 /           |          \
            [ k = 1 ]    [ k = 2 ]    [ k = 3 ]
             /               |               \
           /                 |                 \
         v                   v                   v
|------------------||------------------||------------------|
|  sliding window  ||  sliding window  ||  sliding window  |
| (WindowedStream) || (WindowedStream) || (WindowedStream) |
|------------------||------------------||------------------|
         |                   |                   |
     [ k = 1 ]           [ k = 2 ]           [ k = 3 ]
         |                   |                   |
         v                   v                   v
   |----------|        |----------|        |----------|
   |  reduce  |        |  reduce  |        |  reduce  |
   |----------|        |----------|        |----------|
         \                   |                  /
            \                |                /
               \             |             /
                  \          |          /
                     \       |       /
                        \    |    /
                           \ | /
                       [all products]
                             |
                             v
                      |--------------|
                      |     foo      |
                      | (DataStream) |
                      |--------------|

Редактировать (2018-09-22)

Основываясь на ответе Дэвида, я думаю, что я неправильно истолковал, как именно KeyedStreams работают в сочетании с окном или другим потоком.Почему-то у меня сложилось впечатление, что KeyedStream разделил входящий поток, создав несколько потоков за сценой, а не просто сгруппировав объекты по некоторому значению, используя один и тот же поток.

Я думал, что Флинк делает эквивалент:

List<Foo> eventsForKey1 = ...;
List<Foo> eventsForKey2 = ...;
List<Foo> eventsForKey3 = ...;
...
List<Foo> eventsForKeyN = ...;

Теперь я вижу, что Флинк фактически делает эквивалент:

Map<Key, List<Foo>> events = ...;

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Я думаю , что вы действительно спрашиваете, получите ли вы KeyedStream после операции reduce.Если это так, то ответ «нет», вы получите обычный DataStream.

Хотя с помощью DataStreamUtils.reinterpretAsKeyedStream(DataStream, KeySelector) возможно привести его обратно к KeyedStream, если вы будете осторожны с обеспечениемчто вы не изменили значения полей, которые использовались для создания ключа для окна.

0 голосов
/ 22 сентября 2018

Лучший способ изучить, как будет выглядеть график заданий для различных сценариев, - это написать несколько простых приложений и изучить их диаграммы заданий на панели инструментов, которая поставляется вместе с Flink.

Я не уверен, как интерпретировать разветвление, которое вы показываете после нажатия клавиши keyBy, что затрудняет ответ на ваш вопрос.Если вы спрашиваете о параллелизме результирующего foo DataStream, он может быть тем, чем вы хотите.

Если параллелизм равен 1 как до, так и после keyBy, поток не будет разделен, как вы показали.Вместо этого будет один оператор Window, который обрабатывает все ключи.(Параллелизм не зависит от количества клавиш, хотя оператор с клавишами - например, ваше скользящее окно и его функция уменьшения - не может использовать преимущество параллелизма больше, чем количество клавиш.)

Нодаже в одном узле вы можете иметь несколько ядер и установить параллелизм оператора окна в 3. И результат функции сокращения может обрабатываться параллельно последующими операторами, если вы этого хотите.Но независимо от параллелизма, эта часть вашей работы будет иметь только один DataStream (foo).

Пожалуйста, обновите ваш вопрос, если я его неправильно истолковал, и я попробую еще раз.

...