Exploración preliminar de la implementación de Java de Flink de procesamiento de flujo y procesamiento por lotes

Durante las vacaciones del Dragon Boat Festival, el verano es caluroso y la temperatura está continuamente por encima de los grados 40. Aprenda los conocimientos relacionados con Flink en casa y regístrelos para futuras referencias.
Herramienta de desarrollo : IntelliJ Idea
Flink versión : 1.13.0
Esta vez, Flink se usa principalmente para implementar una implementación simple de procesamiento por lotes (API DataSet) y procesamiento de flujo (API DataStream).

El primer paso, crear un proyecto y agregar dependencias.

1) Crear un nuevo proyecto
Abra Idea, cree un nuevo proyecto Maven, nombre el paquete y el proyecto, y haga clic en Aceptar para ingresar al proyecto.
inserte la descripción de la imagen aquí
2) Introducir dependencias
enpom.xmlAgregue dependencias en el archivo, es decir, Flink-java, flink-streaming, slf4j, etc., puede consultar el siguiente código.

<properties>
    <flink.version>1.13.0</flink.version>
    <java.version>1.8</java.version>
    <scala.binary.version>2.12</scala.binary.version>
    <slf4j.version>1.7.2</slf4j.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-java</artifactId>
        <version>${
    
    flink.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-streaming-java_${
    
    scala.binary.version}</artifactId>
        <version>${
    
    flink.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-clients_${
    
    scala.binary.version}</artifactId>
        <version>${
    
    flink.version}</version>
    </dependency>
    <!-- 日志-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${
    
    slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${
    
    slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-to-slf4j</artifactId>
        <version>2.16.0</version>
    </dependency>
</dependencies>

3) Agregar archivos de registro Agregar archivos de registro en
el directorio de recursoslog4j.propiedades, con el contenido que se muestra a continuación.

log4j.rootLogger=error,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=@-4r [%t] %-5p %c %x - %m%n
El segundo paso es construir el conjunto de datos.

Crear nuevo bajo el proyectocarpeta de entrada, utilizado para almacenar conjuntos de datos, cree uno nuevo debajo de élpalabras.txtEl archivo, que es el conjunto de datos de prueba, se muestra en la siguiente figura.
inserte la descripción de la imagen aquí

El tercer paso, escribir código comercial.

Lea el contenido del conjunto de datos y cuente el recuento de palabras de las palabras. Cree una nueva clase BatchWordCout e introduzca 6 pasos para leer e imprimir el conjunto de datos.
Método 1.
Los principales pasos de procesamiento de la API DataSet de procesamiento por lotes son
1) Crear un entorno de ejecución,
2) Leer datos del entorno,
3) Segmentar cada fila de datos y convertirla en un mapa plano de tipo binario,
4) Agrupar por palabra;
5) Estadísticas agregadas dentro de los grupos;
6) Imprimir resultados
La API DataSet de procesamiento por lotes está escrita de la siguiente manera.

import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.operators.AggregateOperator;
import org.apache.flink.api.java.operators.DataSource;
import org.apache.flink.api.java.operators.FlatMapOperator;
import org.apache.flink.api.java.operators.UnsortedGrouping;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.util.Collector;

public class BatchWordCount {
    
    
    public static void main(String[] args) throws Exception {
    
    
        //1、创建执行环境
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        // 2、从环境中读取数据
        DataSource<String> lineDataSource = env.readTextFile("input/words.txt");
        // 3、将每行数据进行分词,转化成二元组类型 扁平映射
        FlatMapOperator<String,Tuple2<String,Long>> wordAndOneTuple = lineDataSource.flatMap((String line, Collector<Tuple2<String,Long>> out) -> {
    
    
            // 将每行文本进行拆分
            String[] words = line.split(" ");
            // 将每个单词转化成二元组
            for(String word : words){
    
    
                out.collect(Tuple2.of(word,1L));
            }
        }).returns(Types.TUPLE(Types.STRING,Types.LONG));
        // 4、按照word进行分组
         UnsortedGrouping<Tuple2<String,Long>> wordAndOneGroup =  wordAndOneTuple.groupBy(0);
         // 5、分组内进行聚合统计
        AggregateOperator<Tuple2<String, Long>> sum = wordAndOneGroup.sum(1);
        // 6、打印结果
        sum.print();

    }

El efecto de impresión de la consola se muestra en la siguiente figura.
inserte la descripción de la imagen aquí
Después de la versión 1.12 de Flink, la recomendación oficial es usar directamente la API de DataSet, es decir, cambiar el modo de ejecución a BATCH al enviar tareas para procesamiento por lotes.
$bin/flink ejecutar -Dexecution.runtime-mode=BATCH batchWordCount.jar

Método 2. Procesamiento de flujo
Los pasos de procesamiento del procesamiento de flujo de API de DataStream son similares al procesamiento por lotes, la principal diferencia es que el entorno de ejecución es diferente.

import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;

public class BatchSteamWordCount {
    
    
    public static void main(String[] args) throws Exception {
    
    
        // 1、创建流式执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        // 2、读取文件
        DataStreamSource<String> lineDataStreamSource = env.readTextFile("input/words.txt");
        // 3、转换计算
        SingleOutputStreamOperator<Tuple2<String, Long>> wordAndOneTuple = lineDataStreamSource.flatMap((String line, Collector<Tuple2<String, Long>> out) -> {
    
    
            // 将每行文本进行拆分
            String[] words = line.split(" ");
            // 将每个单词转化成二元组
            for (String word : words) {
    
    
                out.collect(Tuple2.of(word, 1L));
            }
        }).returns(Types.TUPLE(Types.STRING, Types.LONG));
        // 4、分组
        KeyedStream<Tuple2<String, Long>, Object> wordAndOneKeyedStream = wordAndOneTuple.keyBy(data -> data.f0);
        // 5、求和
        SingleOutputStreamOperator<Tuple2<String, Long>> sum = wordAndOneKeyedStream.sum(1);
        // 6、打印结果
        sum.print();
        // 7、启动执行
        env.execute();
    }
}

La salida de la consola se muestra en la siguiente figura.
inserte la descripción de la imagen aquí
A partir de los resultados impresos, se puede ver que la ejecución de subprocesos múltiples está fuera de servicio, la primera columna de números está relacionada con la cantidad de núcleos de CPU en el entorno operativo local;

documentos de referencia

【1】https://www.bilibili.com/video/BV133411s7Sa?p=9&vd_source=c8717efb4869aaa507d74b272c5d90be

Supongo que te gusta

Origin blog.csdn.net/u012190388/article/details/131363414
Recomendado
Clasificación