Flinkチュートリアル(18)Flink1.12.0バッチストリーム統合setRuntimeMode(RuntimeExecutionMode.BATCH)問題解決

一つ、問題

Flink 1.12.0には、重要な機能であるバッチストリーム統合があります。つまり、バッチデータは以前のストリーム処理APIで処理できます。

setRuntimeMode(RuntimeExecutionModeexecutionMode)を呼び出すだけです。

RuntimeExecutionModeは列挙型であり、ストリーム、バッチ、および自動があります。

@PublicEvolving
public enum RuntimeExecutionMode {
    
    
    STREAMING,
    BATCH,
    AUTOMATIC;

    private RuntimeExecutionMode() {
    
    
    }
}

最も単純なWordCountプログラムを使用してデモンストレーションを行いましょう。

1.テストするテキストテキスト

apple flink flink
hello es flink
study flink

2. WordCount、setRuntimeModeを設定しないでください

public class Test01_WordCount_Tuple {
    
    

    public static void main(String[] args) throws Exception {
    
    

        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        DataStreamSource<String> source = env.readTextFile(BaseConstant.WORD_COUNT_TEST);

        SingleOutputStreamOperator<Tuple2<String, Integer>> wordAndOne = source
                .flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
    
    

                    @Override
                    public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
    
    
                        String[] split = value.split(" ");
                        if (split != null && split.length > 0) {
    
    
                            Stream<String> stream = Arrays.stream(split);
                            stream.forEach(word -> out.collect(Tuple2.of(word, 1)));
                        }
                    }
                }).returns(Types.TUPLE(Types.STRING, Types.INT));

        SingleOutputStreamOperator<Tuple2<String, Integer>> sum = wordAndOne
                .keyBy(f -> f.f0)
                .sum(1);

        sum.print();

        env.execute();
    }
}

演算結果:バッチデータがストリーム処理の方法で処理されていることがわかりますが、これは私たちが望んでいることではありません

5> (study,1)
7> (flink,1)
6> (es,1)
7> (flink,2)
7> (apple,1)
7> (flink,3)
7> (flink,4)
3> (hello,1)

3. WordCount、ANDsetRuntimeMode(RuntimeExecutionMode.BATCH)

env.setRuntimeMode(RuntimeExecutionMode.BATCH)を設定し、ストリーム処理のkeyByメソッドを使用するだけです。

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

和之前唯一不同的是添加了这行,设置为批处理
env.setRuntimeMode(RuntimeExecutionMode.BATCH);

DataStreamSource<String> source = env.readTextFile(BaseConstant.WORD_COUNT_TEST);

運転結果

7> (flink,4)

このとき、flinkという単語だけが出力されていることがわかりましたが、これは明らかに間違っていました。

4.問題を解決します

ここに画像の説明を挿入
Baiduを通じて、バグがFlink 1.12.1で修正されていることが判明しました。このバグは、バッチリデュース内の単一値のアキュムレータの問題が原因です。
Flink 1.12.1以降にアップグレードします(ブログを作成する場合、最新のものは1.12.2です)。問題を解決できることがわかりました。

Flinkをアップグレードした後、実行結果は次のようになります。このバッチ結果が必要です。

5> (study,1)
6> (es,1)
7> (apple,1)
3> (hello,1)
7> (flink,4)

おすすめ

転載: blog.csdn.net/winterking3/article/details/115294029