Flink1.15ソースコード解析のOperatorChain

目次

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 が設定されていない場合は、演算子チェーンが形成されます。

おすすめ

転載: blog.csdn.net/qq_24186017/article/details/127027744