4

イベントがウィンドウを介して送信され、いくつかの演算子 (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 = ...;
4

2 に答える 2

2

さまざまなシナリオでジョブ グラフがどのように見えるかを調べる最良の方法は、いくつかの単純なアプリケーションを作成し、Flink に付属のダッシュボードでそれらのジョブ グラフを調べることです。

keyBy の後に表示されるファンアウトを解釈する方法がわかりません。これにより、質問への回答が難しくなります。結果の foo DataStream の並列性について質問している場合、それはあなたが望むものであれば何でもかまいません。

keyBy の前後で並列度が 1 の場合、ストリームは示されているように分割されません。代わりに、すべてのキーを処理する単一の Window オペレーターがあります。(並列性はキーの数とは無関係ですが、スライディング ウィンドウやその reduce 関数などのキー付き演算子は、キーの数を超える並列性を利用することはできません。)

しかし、単一のノードであっても、複数のコアを持ち、ウィンドウ オペレーターの並列処理を 3 に設定することができます。必要に応じて、reduce 関数の結果を後続のオペレーターによって並列に処理できます。ただし、並列処理に関係なく、ジョブのその部分には DataStream (foo) が 1 つしかありません。

誤解した場合は質問を更新してください。もう一度やり直します。

于 2018-09-21T21:03:09.877 に答える