イベントがウィンドウを介して送信され、いくつかの演算子 (reduce() や process() など) が適用された後、Apache Flink (1.6.0) が KeyedStreams からのイベントを処理する方法について正確に説明を求めています。
キー付きウィンドウ ストリームのオペレーターが実行された後、単一ノード クラスターを仮定すると、1 つの DataStreams が正確に 1 つまたは正確にk DataStreams ( kはキーの一意の値の数) が残りますか?
明確にするために、いくつかのソースからイベントを読み込み、いくつかのkでキーを設定し、キー付きイベントをウィンドウ化されたストリームに送信し、削減し、他のほとんどすべてを行う必要があると考えてください。次の 2 つのグラフのうち、実際に作成されるのはどれですか?
グラフ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)
Davidの回答に基づいて、KeyedStreamsがウィンドウまたは他のストリームと組み合わせてどのように機能するかを誤解したと思います。どういうわけか、KeyedStream は、同じストリームを使用して何らかの値でオブジェクトをグループ化するのではなく、バックグラウンドで複数のストリームを作成することによって着信ストリームを分割しているという印象を受けました。
Flink は以下と同等のことをしていると思いました:
List<Foo> eventsForKey1 = ...;
List<Foo> eventsForKey2 = ...;
List<Foo> eventsForKey3 = ...;
...
List<Foo> eventsForKeyN = ...;
Flink が実際に以下と同等のことを行っていることがわかりました。
Map<Key, List<Foo>> events = ...;