2017-12-11 11 views
0

、キー付きストリームがある:リユース例えば、ストリームのコピーであるかどうか

val keyedStream: KeyedStream[event, Key] = env 
    .addSource(...) 
    .keyBy(...) 

// several transformations on the same stream 
keyedStream.map(....) 
keyedStream.window(....) 
keyedStream.split(....) 
keyedStream...(....) 

私は何を私が見つけたことは、私は再利用する場合ということです、これはFLINKで同じストリームの再利用だと思いますストリームの内容は他の変換の影響を受けないので、同じストリームのコピーだと思います。

  • しかし、それが正しいかどうかわかりません。

  • もしそうなら、これは多くのリソース(どのリソース?)を使用してコピーを保持しますか?複数の演算子が適用された

答えて

0

DataStream(又はKeyedStream)すべての送信メッセージを複製します。あなたのようなプログラムを持っている場合たとえば、:

val keyedStream: KeyedStream[event, Key] = env 
    .addSource(...) 
    .keyBy(...) 

val stream1: DataStream = keyedStream.map(new MapFunc1) 
val stream2: DataStream = keyedStream.map(new MapFunc2) 

プログラムは

  /-hash-> Map(MapFunc1) -> ... 
Source >-< 
      \-hash-> Map(MapFunc2) -> ... 

として実行されたソースは、各レコードを複製し、両方の下流事業者(MapFunc1MapFunc2)に送信します。演算子の型(この例のMap内)は重要ではありません。

このコストは、各レコードをネットワーク経由で2回送信しています。すべての受信オペレータが同じ並列性を持つ場合、各レコードを一度送信して受信タスクマネージャで複製することで最適化できますが、現在は実行されていません。

単一の受信演算子(IDマップ演算子など)と複数の受信者に転送する別のkeyByを追加して、プログラムを手動で最適化します。すべてのレコードがすでにローカルになっているため、ネットワークのシャッフルは発生しません。しかし、すべてのオペレータは同じ並列性を持たなければなりません。

関連する問題