2017-09-18 6 views
1

私はそれがどのように起こるか把握しようとしています:複数のsocketTextStreamからプログラムを読み込み、これらのテキストストリームを別々のデータフローに送ります。ジョブ)。私はマシンがパフォーマンスに深刻なボトルネックになるように、すべてのソースタスクは一台のマシンにスケジュールされていることが判明したクラスタ上でジョブを実行するとき、しかしFlink SocketTextStreamのソースが1台のマシンにスケジュールされています

for(int i =0; i< hosts.length; i++) { 

    DataStream<String> someStream = env.socketTextStream(hosts[i], ports[i]); 
    DataStream<Tuple2<String, String>> joinedAdImpressions = rawMessageStream.rebalance() ... 
} 

:それは以下のようなものを探します。どのようなアイデアが起こるでしょうか?

ありがとうございます!

+0

私はsocketTextStreamをあまり使いこなすことはありませんでした。だから私は方向を見ることをお勧めします。 kafkaトピックをデータソース(env.addSource(FlinkKafkaConsumer))として使用する場合、クラスタのパーティションが1つしかない場合、kafkaデータソースから受け取ったすべてのデータは1台のマシンにのみ送信されます。だから私は3の並列性を持っている場合、データは3つのうちの1つを通って流れます(あなたがそれが1つのマシンを流れるだけであることを意味するものであることを確かめたい)。これは似たようなものだと思いますが、データソースの種類が異なるだけです。 – Jicaar

答えて

0

すべての異なるSocketTextStreamFunctionソースが同じマシンにスケジュールされる理由は、スロット共有のためです。スロット共有により、Flinkは異なるオペレータに属するタスクを同じスロットにスケジュールできます。これにより、例えば、相互に依存するタスク(例えば、ビルド側、プローブ側、および同じスロット内で実行される実際の結合演算子)間のより良好なコロケーションを達成することが可能になる。さらに、アプリケーションが必要とするスロットの数を簡単に判断することができます。これは、ジョブの最大並列処理です。

ただし、ジョブの独立したコンポーネントはクラスタ全体に広がることはありませんが、通常はスロットの共有によって同じスロット(つまり同じマシン)で終了します。

異なるスロット共有グループ名を明示的に設定すると、ジョブの一部のスロット共有を無効にすることができます。次に、同じスロット共有グループに割り当てられた演算子だけが、スロット共有の対象となります。ダウンストリームオペレータは、入力からスロット共有グループを継承します。したがって、あなたが困惑しながら並行して仕事をしているならば、ソースでスロット共有グループを設定するだけで十分です。

for(int i =0; i< hosts.length; i++) { 
    DataStream<String> someStream = env 
     .socketTextStream(hosts[i], ports[i]) 
     .slotSharingGroup("socket_" + i); 

    DataStream<Tuple2<String, String>> joinedAdImpressions = rawMessageStream.rebalance() ... 
} 
+0

ありがとう、それは私の問題を完全に解決しました。 –

関連する問題