Tutorial de Flink (18) Flink1.12.0 integración de flujo por lotes setRuntimeMode (RuntimeExecutionMode.BATCH) solución de problemas

Uno, el problema

En Flink 1.12.0, hay una función importante, la integración de secuencias por lotes, es decir, los datos por lotes se pueden procesar con la API de procesamiento de secuencias anterior.

Simplemente llame a setRuntimeMode (RuntimeExecutionMode executionMode).

RuntimeExecutionMode es una enumeración, hay stream, batch y automatic.

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

    private RuntimeExecutionMode() {
    
    
    }
}

Usemos el programa WordCount más simple para demostrarlo.

1. Texto txt para ser probado

apple flink flink
hello es flink
study flink

2. WordCount, no establezca 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();
    }
}

Resultado de la operación: se puede ver que los datos del lote se procesan en forma de procesamiento de flujo, que no es lo que queremos

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 , 且 setRuntimeMode (RuntimeExecutionMode.BATCH)

Simplemente configure env.setRuntimeMode (RuntimeExecutionMode.BATCH) y aún use el método keyBy de procesamiento de flujo.

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

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

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

resultado de la operación

7> (flink,4)

En este momento, se encontró que solo se emitía la palabra flink, lo que obviamente era incorrecto.

4. Resuelve el problema

Inserte la descripción de la imagen aquí
Se descubrió a través de Baidu que el error se ha corregido en Flink 1.12.1 El error se debe a un problema con el acumulador de un solo valor en la reducción por lotes.
Actualice a Flink 1.12.1 y superior (al escribir un blog, la última versión es 1.12.2). Descubrió que el problema se puede resolver.

Después de actualizar Flink, el resultado de ejecución es el siguiente: queremos este resultado por lotes.

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

Supongo que te gusta

Origin blog.csdn.net/winterking3/article/details/115294029
Recomendado
Clasificación