Я запрашиваю разъяснения о том, как именно 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 = ...;