[Introducción a Flink] Procesamiento de flujo de Flink WordCount


He aprendido el procesamiento por lotes WordCount de flink antes, ahora aprendamos sobre el procesamiento de flujo WordCount de flink, que en realidad es similar al procesamiento por lotes. La diferencia es que el método para obtener el entorno de ejecución y el método para recibir datos son diferentes. El ExecutionEnvironment.getExecutionEnvironmentproceso por lotes obtiene el entorno de ejecución por lotes mediante el readTextFile("inputParth")método , y luego obtiene el archivo por el método, y el procesamiento de StreamExecutionEnvironment.getExecutionEnvironmentla secuencia obtiene el entorno de ejecución del procesamiento de la secuencia obteniendo el entorno de ejecución del procesamiento de la secuencia, y luego socketTextStream(host, port)obtiene los datos de la secuencia del socket. La lógica de procesamiento estadístico posterior es consistente.

Primero introduzca el archivo pom.xml

<?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>org.fuyun</groupId>
    <artifactId>flinkLearning</artifactId>
    <version>1.0-SNAPSHOT</version>

    <repositories>
        <repository>
            <id>aliyun</id>
            <url>http://repository.apache.org/content/groups/snapshots/</url>
        </repository>
        <repository>
            <id>cloudera</id>
            <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
        </repository>
        <repository>
            <id>jboss</id>
            <url>http://repository.jboss.com/nexus/content/groups/public</url>
        </repository>
    </repositories>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <flink.version>1.12.0</flink.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-java</artifactId>
            <version>${flink.version}</version>
            <!-- provided在这表示此依赖只在代码编译的时候使用,运行和打包的时候不使用 -->
            <!--<scope>provided</scope>-->
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java_2.11</artifactId>
            <version>${flink.version}</version>
            <!--<scope>provided</scope>-->
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-scala_2.11</artifactId>
            <version>${flink.version}</version>
            <!--<scope>provided</scope>-->
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-scala_2.11</artifactId>
            <version>${flink.version}</version>
            <!--<scope>provided</scope>-->
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients_2.12</artifactId>
            <version>${flink.version}</version>
        </dependency>
    </dependencies>

</project>

código de procesamiento de flujo de flink

package com.fuyun.flink

import org.apache.flink.api.java.utils.ParameterTool
import org.apache.flink.streaming.api.scala._

object StreamingWordCount {
    
    

  def main(args: Array[String]): Unit = {
    
    

    //从外部命令中提取参数,作为socket主机名和端口号
    val paramTool = ParameterTool.fromArgs(args)
    val host = paramTool.get("host")
    val port = paramTool.getInt("port")

    // 创建流处理执行环境
    val senv = StreamExecutionEnvironment.getExecutionEnvironment
    // 设置并行度
    senv.setParallelism(8)
    // 接收socket文本流
    //val inputDataStream = senv.socketTextStream("bigdata-training.fuyun.com", 9000)
    val inputDataStream = senv.socketTextStream(host, port)
    // 进行转换处理统计
    val resultDataStream = inputDataStream
      .flatMap(_.split("\\s"))
      .filter(_.nonEmpty)
      .map((_, 1))
      .keyBy(0)
      .sum(1)

    // 打印统计结果
    resultDataStream.print()

    // 必须调用execute方法执行,不然不会触发执行操作,参数为jobName
    senv.execute("stream word count")
  }

}

Ejecución de IDEA

Configure el host y el puerto en Ejecutar de IDEA - >> Editar configuraciones - >> argumentos del programa
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Después de configurar los parámetros, ejecute el comando en la máquina virtual nc -lk 9000, luego ejecute el programa en IDEA, ingrese la palabra en la máquina virtual e IDEA verá los resultados estadísticos.
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

El resultado en IDEA muestra que aparece 3>el número delante de la captura de pantalla . Debido a que el paralelismo se establece en 8 en el programa de código, 3>y la identificación para el paralelismo es 3, la identificación no será mayor que 8 y el paralelismo puede ser se establece cada vez en el programa. Se puede configurar en cada cálculo. Por ejemplo, en el código anterior, el paralelismo se establece en 8 después de que se crea el entorno de procesamiento de flujo. El paralelismo se establece de forma predeterminada en el número de núcleos de CPU de la computadora en sí (si el paralelismo no se establece en el programa), si en el operador Si se establece el grado de paralelismo, se utiliza el grado de paralelismo establecido. Por ejemplo, en el código anterior: Cuando se resultDataStream.print()cambia resultDataStream.print().setParallelism(1), el resultado impreso no tendrá un 3>resultado similar , porque el grado de paralelismo es solo 1.
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/lz6363/article/details/112600899
Recomendado
Clasificación