目次
Flink はオペレーターがオペレーターチェーンを形成できるかどうかをどのように判断しますか?
この記事では、まずオペレーターがどのような状況で操作チェーンを形成できるかを要約し、次にソース コード分析用のワードカウント コード (Flink 1.15.2 バージョン) に従って isChainable を実際に決定する手順を段階的に説明します。
Flink はオペレーターがオペレーターチェーンを形成できるかどうかをどのように判断しますか?
- 以下の条件を満たした場合
- ダウンストリーム演算子の入力エッジは 1 である必要があり、ダウンストリーム演算子を接続、結合、または結合にすることはできません。
- 上流のオペレーターと下流のオペレーターは両方とも同じ SlotSharingGroup 内にあります
- 下流の演算子が null ではない、または上流の演算子が null ではない
- downStreamOperator は YieldingOperatorFactory クラスに属しておらず、ソース タイプは LegacySource ではありません
- upStreamOperator.ChainingStrategy は ALWAYS、HEAD、HEAD_WITH_SOURCES タイプです
- downStreamOperator.ChainStrategy は ALWAYS、HEAD_WITH_SOURCES (上流のみがソース)
- OutputPartitioner は ForwardPartitioner です。つまり、オペレーターの下流のパーティションは ForwardPartitioner です。
- StreamEdge の ExchangeMode は BATCH モードではありません
- streamGraph.isChainingEnabled が true であり、ジョブは disableChaining() を呼び出しません。
ここではワードカウントコードを使用して説明と分析を行います
WordCount.java
public class WordCount {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env=
StreamExecutionEnvironment.getExecutionEnvironment();
env.socketTextStream("localhost",9999)
.flatMap(new FlatMapFunction<String,Tuple2<String, Integer>>() {
@Override
public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
String[] words=value.split(",");
for (String word:words) {
out.collect(new Tuple2<>(word,1));
}
}
}).keyBy(0)
.window(TumblingProcessingTimeWindows.of(Time.seconds(10)))
.sum(1).print();
env.execute();
}
}
StreamingJobGenerator.javaのcreateChain()メソッドでisChainableの判定を行う
isChainable(outEdge, streamGraph) メソッドを入力します。
public static boolean isChainable(StreamEdge edge, StreamGraph streamGraph) {
StreamNode downStreamVertex = streamGraph.getTargetVertex(edge);
return downStreamVertex.getInEdges().size() == 1 && isChainableInput(edge, streamGraph);
}
wordcount コードを例にとると、最初に入力されたエッジは、source-> flatmap です。
downStreamVertex: フラットマップであるダウンストリーム StreamNode の場合、フラットマップの入力エッジが 1 であるかどうかを判断します。条件を満たした後、isChanableInput(edge, streamGraph) を入力します。
areOperatorChainable()メソッドは主にChainingStrategyの判定を行います。
source-> flatmap の処理において、outputPartitioner=REBALANCE は ForwardPartitioner クラスではないため、source-> flatmap は OperatorChain ではありません。
flatmap->window パーティションは KeyGroupStreamPartitioner ですが、ForwardPartitioner ではなく、operatorChain を形成することもできません。
window->sink パーティションは FORWARD であり、operatorChain と呼び出すことができます。
もちろん、テストのためにさまざまなスロット共有グループを追加し、オペレータ レベルで disableChaining を設定することもできます。
要約:
アップストリーム オペレーターがユニオン、接続、またはジョインではなく、オペレーター パーティションが Forwardpartitioner モードで、アップストリーム オペレーターとダウンストリーム オペレーターが同じスロット共有グループに属している場合。disableChaining が設定されていない場合は、演算子チェーンが形成されます。