flink1.17.0 integra kafka y calcula


prefacio

Flink es un componente de integración importante para la computación en tiempo real. Aquí se explica cómo integrarlo y usar un pequeño ejemplo. Un ejemplo son los mensajes de entrada kafka, separados por comas, contando el número de ocurrencias de cada palabra idéntica, tal función.


1. Preparación del entorno Kafka

1.1 iniciar kafka

La versión de kafka que uso aquí es 3.2.0, el método de implementación puede referirse a
la implementación de kafka

cd kafka_2.13-3.2.0
bin/zookeeper-server-start.sh config/zookeeper.properties
bin/kafka-server-start.sh config/server.properties

Después de comenzar, verifique si el proceso Java existe y ejecute el siguiente paso después de que exista.

1.2 Crear un nuevo tema

Crear un nuevo tema dedicado al consumo de flink

bin/kafka-topics.sh --create --topic flinkTest --bootstrap-server 192.168.184.129:9092

1.3 Probar si la producción y el consumo son normales

Lado de producción:

bin/kafka-console-producer.sh --topic flinkTest --bootstrap-server 192.168.184.129:9092

cliente:

bin/kafka-console-consumer.sh --topic flinkTest --from-beginning --bootstrap-server 192.168.184.129:9092

1.4 Consumo de producción de prueba

Ingrese aaa en el lado de producción
inserte la descripción de la imagen aquí
para verificar si el cliente puede consumir.
inserte la descripción de la imagen aquí
Puede ver que el cliente ha consumido correctamente y que el entorno kafka está listo.

2. Flink integra kafka

2.1 modificación del archivo pom

Antes de modificar el archivo pom, echemos un vistazo a la guía y las dependencias del sitio web oficial.
Aquí usamos la API de flujo de datos para hacerlo.
Documento oficial de Flink1.17.0

inserte la descripción de la imagen aquí
Aquí está la versión del paquete de dependencia que debe importarse para las dependencias relevantes, y la versión del paquete de conexión que debe importarse cuando se usa el consumo de kafka. La
inserte la descripción de la imagen aquí
dependencia completa de importación de pom es la siguiente:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wh.flink</groupId>
    <artifactId>flink</artifactId>
    <version>1.0-SNAPSHOT</version>

    <name>flink</name>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <flink.version>1.17.1</flink.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-connector-kafka</artifactId>
            <version>${
    
    flink.version}</version>
        </dependency>
        <!-- Flink 依赖 -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-java</artifactId>
            <version>${
    
    flink.version}</version>
            <!--<scope>provided</scope>-->
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java</artifactId>
            <version>${
    
    flink.version}</version>
            <!--<scope>provided</scope>-->
        </dependency>


        <!-- Flink Kafka连接器的依赖 -->
<!--        <dependency>-->
<!--            <groupId>org.apache.flink</groupId>-->
<!--            <artifactId>flink-connector-kafka-0.11_2.11</artifactId>-->
<!--            <version>${
    
    flink.version}</version>-->
<!--        </dependency>-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>

        <!-- Flink 开发Scala需要导入以下依赖 -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-scala_2.12</artifactId>
            <version>${
    
    flink.version}</version>
            <!--<scope>provided</scope>-->
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-scala_2.12</artifactId>
            <version>${
    
    flink.version}</version>
            <!--<scope>provided</scope>-->
        </dependency>

        <!--<dependency>-->
        <!--<groupId>org.scala-lang</groupId>-->
        <!--<artifactId>scala-library</artifactId>-->
        <!--<version>2.11.12</version>-->
        <!--</dependency>-->

        <!-- log4j 和slf4j 包,如果在控制台不想看到日志,可以将下面的包注释掉-->
        <!--<dependency>-->
        <!--<groupId>org.slf4j</groupId>-->
        <!--<artifactId>slf4j-log4j12</artifactId>-->
        <!--<version>1.7.25</version>-->
        <!--<scope>test</scope>-->
        <!--</dependency>-->
        <!--<dependency>-->
        <!--<groupId>log4j</groupId>-->
        <!--<artifactId>log4j</artifactId>-->
        <!--<version>1.2.17</version>-->
        <!--</dependency>-->
        <!--<dependency>-->
        <!--<groupId>org.slf4j</groupId>-->
        <!--<artifactId>slf4j-api</artifactId>-->
        <!--<version>1.7.25</version>-->
        <!--</dependency>-->
        <!--<dependency>-->
        <!--<groupId>org.slf4j</groupId>-->
        <!--<artifactId>slf4j-nop</artifactId>-->
        <!--<version>1.7.25</version>-->
        <!--<scope>test</scope>-->
        <!--</dependency>-->
        <!--<dependency>-->
        <!--<groupId>org.slf4j</groupId>-->
        <!--<artifactId>slf4j-simple</artifactId>-->
        <!--<version>1.7.5</version>-->
        <!--</dependency>-->



    </dependencies>

    <build>
        <plugins>

            <!-- 在maven项目中既有java又有scala代码时配置 maven-scala-plugin 插件打包时可以将两类代码一起打包 -->
<!--            <plugin>-->
<!--                <groupId>org.scala-tools</groupId>-->
<!--                <artifactId>maven-scala-plugin</artifactId>-->
<!--                <version>2.15.2</version>-->
<!--                <executions>-->
<!--                    <execution>-->
<!--                        <goals>-->
<!--                            <goal>compile</goal>-->
<!--                            <goal>testCompile</goal>-->
<!--                        </goals>-->
<!--                    </execution>-->
<!--                </executions>-->
<!--            </plugin>-->

            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <!-- 设置false后是去掉 MySpark-1.0-SNAPSHOT-jar-with-dependencies.jar 后的 “-jar-with-dependencies” -->
                    <!--<appendAssemblyId>false</appendAssemblyId>-->
                    <archive>
                        <manifest>
                            <mainClass>com.hadoop.demo.service.flinkDemo.FlinkDemo</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>assembly</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

La estructura del proyecto se muestra en la figura.
inserte la descripción de la imagen aquí

2.2 Escritura de código

package com.hadoop.demo.service.flinkDemo;

import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.api.java.functions.FlatMapIterator;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.connector.kafka.source.KafkaSource;
import org.apache.flink.connector.kafka.source.enumerator.initializer.OffsetsInitializer;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

import java.util.Arrays;
import java.util.Iterator;

public class FlinkDemo {
    
    




    public static void main(String[] args) throws Exception {
    
    
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        //新建kafka连接
        KafkaSource<String> kfkSource = KafkaSource.<String>builder()
                .setBootstrapServers("192.168.184.129:9092")
                .setGroupId("flink")
                .setTopics("flinkTest")
                .setStartingOffsets(OffsetsInitializer.earliest())
                .setValueOnlyDeserializer(new SimpleStringSchema())
                .build();
        //添加到flink环境
        DataStreamSource<String> lines = env.fromSource(kfkSource, WatermarkStrategy.noWatermarks(), "kafka source");
        //根据逗号分组
        SingleOutputStreamOperator<Tuple2<String, Integer>> map = lines.flatMap(new FlatMapIterator<String, String>() {
    
    
            @Override
            public Iterator<String> flatMap(String s) throws Exception {
    
    
                return Arrays.asList(s.split(",")).iterator();
            }
        }).map(new MapFunction<String, Tuple2<String, Integer>>() {
    
    
            @Override
            public Tuple2<String, Integer> map(String s) throws Exception {
    
    
                return new Tuple2<>(s, 1);
            }
        });

        //统计每个单词的数量
        SingleOutputStreamOperator<Tuple2<String, Integer>> sum = map.keyBy(0).sum(1);
        sum.print();
        //System.out.println(sum.get);
        env.execute();
    }

}

2.3 empaquetado expertoinserte la descripción de la imagen aquí

Haga clic en el botón del paquete, preste atención para seleccionar el paquete jar con dependencias, de lo contrario aparecerá el siguiente error.

NoClassDefFoundError: org/apache/flink/connector/kafka/source/KafkaSource

3. prueba

3.1 Inicie el clúster de hadoop, inicie el clúster de flink

Si no sabe cómo construir estos dos clústeres aquí, puede leer mis otros artículos
Flink integrado de hadoop

./hadoop.sh start
./bin/yarn-session.sh --detached

3.2 Cargue el paquete jar en el clúster flink

inserte la descripción de la imagen aquí
Después de cargar, complete el nombre de la clase principal y haga clic en Enviar
inserte la descripción de la imagen aquí

3.3 Pruebas

Después de hacer clic, puede ver el trabajo de ejecución. Aquí puede ver el trabajo en ejecución.
inserte la descripción de la imagen aquí
Haga clic en la tarea en ejecución .
inserte la descripción de la imagen aquí
Haga clic en
inserte la descripción de la imagen aquí
la salida. Aquí puede ver el contenido de la salida.
Ingrese el contenido en el lado del consumidor kafka.
inserte la descripción de la imagen aquí
Aquí aparece el jbs 4 veces. Mire la consola de salida.
inserte la descripción de la imagen aquí
Puede ver que se ha agregado cuatro veces seguidas, lo que indica que las estadísticas han tenido efecto.


Resumir

Aquí hay un ejemplo simple de consumo de kafka. Después de que el consumo sea exitoso, se puede enviar a través del fregadero y también se puede convertir con transform. Lo demostraré más adelante aquí. Si es incorrecto, puede señalarlo afuera.

Supongo que te gusta

Origin blog.csdn.net/qq_34526237/article/details/130968153
Recomendado
Clasificación