Todos los productos
Search
Centro de documentos

Realtime Compute for Apache Flink:Desarrollo de un trabajo JAR

Última actualización: Sep 03, 2026

La API DataStream de Flink ofrece un modelo de programación flexible para crear transformaciones de datos personalizadas, operaciones y operadores que permiten manejar lógica de negocio compleja y procesamiento de datos.

Compatibilidad con Apache Flink

La API DataStream compatible con Realtime Compute for Apache Flink es totalmente compatible con la versión de código abierto de Apache Flink. Para obtener más información, consulte ¿Qué es Apache Flink? y la Guía de programación de la API DataStream de Flink.

Requisitos previos

  • Tener instalado un entorno de desarrollo integrado (IDE), como IntelliJ IDEA.

  • Tener instalada la versión 3.6.3 o posterior de Maven.

  • El desarrollo de trabajos solo es compatible con JDK 8 y JDK 11.

  • Desarrolle su trabajo JAR localmente antes de desplegarlo y ejecutarlo en la consola de Realtime Compute for Apache Flink.

Antes de empezar

Prepare con antelación los orígenes de datos necesarios, ya que este ejemplo utiliza conectores de origen de datos.

Nota
  • Este ejemplo utiliza ApsaraMQ for Kafka (2.6.2) y ApsaraDB RDS for MySQL (8.0) como orígenes de datos.

  • Si cuenta con orígenes de datos autogestionados que requieren acceso a la red pública o acceso entre VPC, consulte Network connectivity options.

  • Si no dispone de un origen de datos de ApsaraMQ for Kafka, adquiera y despliegue una instancia. Para obtener más información, consulte Step 2: Purchase and deploy an instance. Al desplegar la instancia, asegúrese de que se encuentre en la misma VPC que su espacio de trabajo de Realtime Compute for Apache Flink.

  • Si no dispone de un origen de datos de ApsaraDB RDS for MySQL, adquiera una instancia de ApsaraDB RDS for MySQL. Para obtener más información, consulte Step 1: Create an ApsaraDB RDS for MySQL instance and configure a database. Al adquirir la instancia, asegúrese de que se encuentre en la misma región y VPC que su espacio de trabajo de Realtime Compute for Apache Flink.

Desarrollo del trabajo

Configuración de las dependencias del entorno de Flink

Nota

Para evitar conflictos de dependencias JAR, siga estas directrices:

  • ${flink.version} especifica la versión de Flink para la ejecución del trabajo. Esta versión debe coincidir con la versión de Flink del motor VVR que seleccionó en la página de despliegue del trabajo. Por ejemplo, si selecciona el motor vvr-8.0.9-flink-1.17 en la página de despliegue del trabajo, su versión correspondiente de Flink es 1.17.2. Para obtener más información sobre las versiones del motor VVR, consulte How do I check the Flink version of the current job?.

  • Para las dependencias de Flink, establezca el scope como provided agregando <scope>provided</scope>. Esto incluye principalmente las dependencias que no son de conectores dentro del grupo org.apache.flink y que comienzan con flink-.

  • En el código fuente de Flink, solo los métodos anotados explícitamente con @Public o @PublicEvolving son API públicas. Realtime Compute for Apache Flink garantiza la compatibilidad únicamente para estos métodos.

  • Si utiliza la API DataStream de un conector integrado de Flink, use las dependencias proporcionadas.

A continuación se muestran las dependencias básicas de Flink. Es posible que también necesite agregar dependencias de registro. Para consultar la lista completa de dependencias, vea Complete code example al final de este tema.

Dependencias de Flink

         <!-- Apache Flink dependencies -->
        <!-- These dependencies are set to 'provided' because they should not be packaged into the JAR file. -->
        <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>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients</artifactId>
            <version>${flink.version}</version>
            <scope>provided</scope>
        </dependency>

Dependencias y uso de conectores

Para leer y escribir datos con la API DataStream, utilice un conector DataStream para conectarse a Realtime Compute for Apache Flink. El repositorio central de Maven proporciona conectores DataStream de VVR que puede utilizar durante el desarrollo.

Importante

Utilice únicamente los conectores especificados como compatibles con la API DataStream en Supported connectors. No use un conector si no está marcado explícitamente como compatible con la API DataStream, ya que sus interfaces y parámetros podrían cambiar en el futuro.

Puede utilizar un conector de una de las siguientes maneras:

(Recomendado) Carga como dependencia adicional

  1. En el archivo pom.xml de su trabajo, agregue el conector necesario como dependencia del proyecto con el scope "provided". Para consultar el archivo de dependencias completo, vea Complete code example al final de este tema.

    Nota
    • ${vvr.version} es la versión del motor de ejecución del trabajo. Por ejemplo, si su trabajo se ejecuta en el motor vvr-8.0.9-flink-1.17, la versión correspondiente de Flink es 1.17.2. Se recomienda utilizar el motor más reciente. Para obtener información sobre versiones específicas, consulte Engine.

    • Dado que el paquete JAR del conector se agrega como dependencia adicional, no es necesario incluirlo en el JAR de la aplicación. Por lo tanto, debe declarar su scope como provided.

            <!-- Kafka connector dependency -->
            <dependency>
                <groupId>com.alibaba.ververica</groupId>
                <artifactId>ververica-connector-kafka</artifactId>
                <version>${vvr.version}</version>
                <scope>provided</scope>
            </dependency>
            <!-- MySQL connector dependency -->
            <dependency>
                <groupId>com.alibaba.ververica</groupId>
                <artifactId>ververica-connector-mysql</artifactId>
                <version>${vvr.version}</version>
                <scope>provided</scope>
            </dependency>
  2. Si necesita desarrollar nuevos conectores o ampliar la funcionalidad de los existentes, su proyecto también debe depender de los paquetes comunes de conectores flink-connector-base o ververica-connector-common.

            <!-- Basic dependency for Flink connector public interfaces -->
            <dependency>
                <groupId>org.apache.flink</groupId>
                <artifactId>flink-connector-base</artifactId>
                <version>${flink.version}</version>
            </dependency>
            <!-- Basic dependency for Alibaba Cloud connector public interfaces -->
            <dependency>
                <groupId>com.alibaba.ververica</groupId>
                <artifactId>ververica-connector-common</artifactId>
                <version>${vvr.version}</version>
            </dependency>
  3. Para consultar las configuraciones de conexión DataStream y ejemplos de código, revise la documentación del conector DataStream correspondiente.

    Para ver una lista de conectores compatibles con la API DataStream, consulte Supported connectors.

  4. Despliegue el trabajo y agregue los paquetes JAR del conector correspondiente en el campo Additional Dependencies. Para obtener más información, consulte Deploy a JAR job. Puede cargar sus conectores personalizados o los proporcionados por Realtime Compute for Apache Flink. Para descargar los conectores, consulte Conectores.

    Por ejemplo, cargue los paquetes JAR de los conectores ververica-connector-mysql-1.17-vvr-8.0.4-1.jar y ververica-connector-kafka-1.17-vvr-8.0.4-1.jar, así como el archivo de configuración config.properties.

Empaquetado en el JAR del trabajo

  1. Agregue los conectores necesarios como dependencias del proyecto en el archivo pom.xml de su trabajo. El siguiente código muestra un ejemplo para los conectores de Kafka y MySQL.

    Nota
    • ${vvr.version} es la versión del motor del entorno de ejecución del trabajo. Por ejemplo, si su trabajo se ejecuta en la versión del motor vvr-8.0.9-flink-1.17, su versión correspondiente de Flink es 1.17.2. Se recomienda utilizar el motor más reciente. Para obtener más información, consulte Engines.

    • Si empaqueta conectores en el JAR del trabajo como dependencias del proyecto, deben estar en el scope predeterminado (compile).

            <!-- Kafka connector dependency -->
            <dependency>
                <groupId>com.alibaba.ververica</groupId>
                <artifactId>ververica-connector-kafka</artifactId>
                <version>${vvr.version}</version>
            </dependency>
            <!-- MySQL connector dependency -->
            <dependency>
                <groupId>com.alibaba.ververica</groupId>
                <artifactId>ververica-connector-mysql</artifactId>
                <version>${vvr.version}</version>
            </dependency>
  2. Si necesita desarrollar nuevos conectores o ampliar la funcionalidad de los existentes, su proyecto también requiere el paquete común de conectores flink-connector-base o ververica-connector-common.

            <!-- Basic dependency for Flink connector public interfaces -->
            <dependency>
                <groupId>org.apache.flink</groupId>
                <artifactId>flink-connector-base</artifactId>
                <version>${flink.version}</version>
            </dependency>
            <!-- Basic dependency for Alibaba Cloud connector public interfaces -->
            <dependency>
                <groupId>com.alibaba.ververica</groupId>
                <artifactId>ververica-connector-common</artifactId>
                <version>${vvr.version}</version>
            </dependency>
  3. Para consultar las configuraciones de conexión DataStream y ejemplos de código, revise la documentación del conector DataStream correspondiente.

    Para ver una lista de conectores compatibles con la API DataStream, consulte Supported connectors.

Lectura de dependencias adicionales desde OSS

Los trabajos JAR de Flink no pueden leer archivos de configuración locales desde el método main. En su lugar, cargue el archivo de configuración en el bucket de OSS de su espacio de trabajo, agréguelo como dependencia adicional durante el despliegue y léalo en tiempo de ejecución. La siguiente sección proporciona un ejemplo.

  1. Cree un archivo de configuración llamado config.properties para evitar codificar credenciales directamente en su código.

    # Kafka 
    bootstrapServers=host1:9092,host2:9092,host3:9092
    inputTopic=topic
    groupId=groupId
    # MySQL
    database.url=jdbc:mysql://localhost:3306/my_database
    database.username=username
    database.password=password
  2. En su trabajo JAR, utilice código para leer el archivo config.properties almacenado en el bucket de OSS.

    Método 1: Lectura desde el bucket del espacio de trabajo

    1. En el panel de navegación izquierdo de la consola de Realtime Compute for Apache Flink, vaya a la página Artifacts y cargue el archivo.

    2. Durante la ejecución, los archivos agregados en el campo Additional Dependencies se cargan en el directorio /flink/usrlib del pod donde se ejecuta el trabajo.

    3. El siguiente código proporciona un ejemplo de cómo leer este archivo de configuración.

                  Properties properties = new Properties();
                  Map<String,String> configMap = new HashMap<>();
                  try (InputStream input = new FileInputStream("/flink/usrlib/config.properties")) {
                      // Load the property file.
                      properties.load(input);
                      // Obtain the property values.
                      configMap.put("bootstrapServers",properties.getProperty("bootstrapServers")) ;
                      configMap.put("inputTopic",properties.getProperty("inputTopic"));
                      configMap.put("groupId",properties.getProperty("groupId"));
                      configMap.put("url",properties.getProperty("database.url")) ;
                      configMap.put("username",properties.getProperty("database.username"));
                      configMap.put("password",properties.getProperty("database.password"));
                  } catch (IOException ex) {
                      ex.printStackTrace();
                  }

    Método 2: Lectura desde un bucket autorizado

    1. Cargue el archivo de configuración en el bucket de OSS de destino.

    2. Utilice OSSClient para leer el archivo directamente desde OSS. Para obtener más información, consulte Streaming download y Manage access credentials. El siguiente código proporciona un ejemplo.

      OSS ossClient = new OSSClientBuilder().build("Endpoint", "AccessKeyId", "AccessKeySecret");
      try (OSSObject ossObject = ossClient.getObject("examplebucket", "exampledir/config.properties");
           BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()))) {
          // read file and process ...
      } finally {
          if (ossClient != null) {
              ossClient.shutdown();
          }
      }

Escritura de la lógica de negocio

  1. Puede integrar orígenes de datos externos en programas de flujo de datos de Flink. Una Watermark es una estrategia de cálculo de Flink basada en semántica temporal que suele utilizarse junto con marcas de tiempo. Por lo tanto, este ejemplo no utiliza una estrategia de watermark. Para obtener más información, consulte Estrategia de Watermark.

             // Integrate the external data source into the Flink data stream program.
            // WatermarkStrategy.noWatermarks() indicates that no watermark strategy is used.
            DataStreamSource<String> stream = env.fromSource(kafkaSource, WatermarkStrategy.noWatermarks(), "kafka Source");
  2. La transformación de operadores convierte un DataStream<String> en un DataStream<Student> en este ejemplo. Para transformaciones de operadores más complejas y métodos de procesamiento, consulte Operadores de Flink.

              // Operator that converts the data structure to Student.
              DataStream<Student> source = stream
                    .map(new MapFunction<String, Student>() {
                        @Override
                        public Student map(String s) throws Exception {
                            // Data is separated by commas.
                            String[] data = s.split(",");
                            return new Student(Integer.parseInt(data[0]), data[1], Integer.parseInt(data[2]));
                        }
                    }).filter(student -> student.score >=60); // Filter for data where the score is 60 or higher.

Empaquetado del trabajo

Empaquete el trabajo mediante maven-shade-plugin.

Importante
  • Si agrega el conector como dependencia adicional, asegúrese de que el scope de las dependencias del conector esté establecido como provided al empaquetar el trabajo.

  • Si empaqueta conectores en el JAR del trabajo, utilice el scope predeterminado (compile).

Referencia de dependencias de maven-shade-plugin

<build>
        <plugins>
            <!-- Java Compiler -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.11.0</version>
                <configuration>
                    <source>${target.java.version}</source>
                    <target>${target.java.version}</target>
                </configuration>
            </plugin>
            <!-- We use the maven-shade-plugin to create a fat JAR that contains all necessary dependencies. -->
            <!-- Modify the value of <mainClass> if your program's entry point changes. -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <!-- Exclude unnecessary dependencies. -->
                        <configuration>
                            <artifactSet>
                                <excludes>
                                    <exclude>org.apache.flink:force-shading</exclude>
                                    <exclude>com.google.code.findbugs:jsr305</exclude>
                                    <exclude>org.slf4j:*</exclude>
                                    <exclude>org.apache.logging.log4j:*</exclude>
                                </excludes>
                            </artifactSet>
                            <filters>
                                <filter>
                                    <!-- Do not copy the signatures from the META-INF directory.
                                    Otherwise, security exceptions may be thrown when you use the JAR file. -->
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                            <transformers>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.aliyun.FlinkDemo</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

Prueba y despliegue del trabajo

  • De forma predeterminada, Realtime Compute for Apache Flink no tiene acceso a Internet público, lo que impide realizar pruebas directas en un entorno local. Se recomienda realizar pruebas unitarias por separado. Para obtener más información, consulte Run and debug a job with connectors locally.

  • Para desplegar el trabajo JAR, consulte Deploy a JAR job.

    Nota
    • Durante el despliegue, si utiliza conectores como dependencias adicionales, asegúrese de cargar los paquetes JAR correspondientes.

    • Si necesita leer un archivo de configuración, también debe cargarlo como dependencia adicional.

Ejemplo de código completo

Este ejemplo procesa datos desde un origen de ApsaraMQ for Kafka y escribe el resultado en un destino de ApsaraDB RDS for MySQL. Este ejemplo es solo de referencia. Para obtener más directrices sobre estilo y calidad de código, consulte la Guía de estilo y calidad de código.

Nota

Este ejemplo omite configuraciones de parámetros de ejecución como checkpoint, TTL y estrategia de reinicio. Puede configurar estos ajustes en la página de deployment details después de desplegar el trabajo. Dado que la configuración en el código tiene mayor prioridad, se recomienda configurarla después del despliegue para simplificar futuras actualizaciones. Para obtener más información, consulte Configure job deployment information.

FlinkDemo.java

package com.aliyun;
import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.connector.jdbc.JdbcConnectionOptions;
import org.apache.flink.connector.jdbc.JdbcExecutionOptions;
import org.apache.flink.connector.jdbc.JdbcSink;
import org.apache.flink.connector.jdbc.JdbcStatementBuilder;
import org.apache.flink.connector.kafka.source.KafkaSource;
import org.apache.flink.connector.kafka.source.enumerator.initializer.OffsetsInitializer;
import org.apache.flink.connector.kafka.source.reader.deserializer.KafkaRecordDeserializationSchema;
import org.apache.flink.kafka.shaded.org.apache.kafka.common.serialization.StringDeserializer;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class FlinkDemo {
    // Define the data structure.
    public static class Student {
        public int id;
        public String name;
        public int score;
        public Student(int id, String name, int score) {
            this.id = id;
            this.name = name;
            this.score = score;
        }
    }
    public static void main(String[] args) throws Exception {
        // Create a Flink execution environment.
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        Properties properties = new Properties();
        Map<String,String> configMap = new HashMap<>();
        try (InputStream input = new FileInputStream("/flink/usrlib/config.properties")) {
            // Load the property file.
            properties.load(input);
            // Obtain the property values.
            configMap.put("bootstrapServers",properties.getProperty("bootstrapServers")) ;
            configMap.put("inputTopic",properties.getProperty("inputTopic"));
            configMap.put("groupId",properties.getProperty("groupId"));
            configMap.put("url",properties.getProperty("database.url")) ;
            configMap.put("username",properties.getProperty("database.username"));
            configMap.put("password",properties.getProperty("database.password"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        // Build Kafka source
        KafkaSource<String> kafkaSource = KafkaSource.<String>builder()
                        .setBootstrapServers(configMap.get("bootstrapServers"))
                        .setTopics(configMap.get("inputTopic"))
                        .setStartingOffsets(OffsetsInitializer.latest())
                        .setGroupId(configMap.get("groupId"))
                        .setDeserializer(KafkaRecordDeserializationSchema.valueOnly(StringDeserializer.class))
                        .build();
        // Integrate the external data source into the Flink data stream program.
        // WatermarkStrategy.noWatermarks() indicates that no watermark strategy is used.
        DataStreamSource<String> stream = env.fromSource(kafkaSource, WatermarkStrategy.noWatermarks(), "kafka Source");
        // Filter for scores of 60 or higher.
        DataStream<Student> source = stream
                .map(new MapFunction<String, Student>() {
                    @Override
                    public Student map(String s) throws Exception {
                        String[] data = s.split(",");
                        return new Student(Integer.parseInt(data[0]), data[1], Integer.parseInt(data[2]));
                    }
                }).filter(Student -> Student.score >=60);
        source.addSink(JdbcSink.sink("INSERT IGNORE INTO student (id, username, score) VALUES (?, ?, ?)",
                new JdbcStatementBuilder<Student>() {
                    public void accept(PreparedStatement ps, Student data) {
                        try {
                            ps.setInt(1, data.id);
                            ps.setString(2, data.name);
                            ps.setInt(3, data.score);
                        } catch (SQLException e) {
                            throw new RuntimeException(e);
                        }
                    }
                },
                new JdbcExecutionOptions.Builder()
                        .withBatchSize(5) // Number of records per batch write.
                        .withBatchIntervalMs(2000) // Batch interval in milliseconds.
                        .build(),
                new JdbcConnectionOptions.JdbcConnectionOptionsBuilder()
                        .withUrl(configMap.get("url"))
                        .withDriverName("com.mysql.cj.jdbc.Driver")
                        .withUsername(configMap.get("username"))
                        .withPassword(configMap.get("password"))
                        .build()
        )).name("Sink MySQL");
        env.execute("Flink Demo");
    }
}

pom.xml

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.aliyun</groupId>
    <artifactId>FlinkDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>FlinkDemo</name>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <flink.version>1.17.1</flink.version>
        <vvr.version>1.17-vvr-8.0.4-1</vvr.version>
        <target.java.version>1.8</target.java.version>
        <maven.compiler.source>${target.java.version}</maven.compiler.source>
        <maven.compiler.target>${target.java.version}</maven.compiler.target>
        <log4j.version>2.14.1</log4j.version>
    </properties>
    <dependencies>
        <!-- Apache Flink dependencies -->
        <!-- These dependencies are set to 'provided' because they should not be packaged into the JAR file. -->
        <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>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients</artifactId>
            <version>${flink.version}</version>
            <scope>provided</scope>
        </dependency>
        <!-- Add connector dependencies here. They must be in the default scope (compile). -->
        <dependency>
            <groupId>com.alibaba.ververica</groupId>
            <artifactId>ververica-connector-kafka</artifactId>
            <version>${vvr.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.ververica</groupId>
            <artifactId>ververica-connector-mysql</artifactId>
            <version>${vvr.version}</version>
        </dependency>
        <!-- Add a logging framework to generate console output at runtime. -->
        <!-- By default, these dependencies are excluded from the application JAR. -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>${log4j.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>${log4j.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>${log4j.version}</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <!-- Java Compiler -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.11.0</version>
                <configuration>
                    <source>${target.java.version}</source>
                    <target>${target.java.version}</target>
                </configuration>
            </plugin>
            <!-- We use the maven-shade-plugin to create a fat JAR that contains all necessary dependencies. -->
            <!-- Modify the value of <mainClass> if your program's entry point changes. -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <!-- Exclude unnecessary dependencies. -->
                        <configuration>
                            <artifactSet>
                                <excludes>
                                    <exclude>org.apache.flink:force-shading</exclude>
                                    <exclude>com.google.code.findbugs:jsr305</exclude>
                                    <exclude>org.slf4j:*</exclude>
                                    <exclude>org.apache.logging.log4j:*</exclude>
                                </excludes>
                            </artifactSet>
                            <filters>
                                <filter>
                                    <!-- Do not copy the signatures from the META-INF directory.
                                    Otherwise, security exceptions may be thrown when you use the JAR file. -->
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                            <transformers>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.aliyun.FlinkDemo</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

Documentación relacionada

  • Para ver una lista de conectores compatibles con la API DataStream, consulte Supported connectors.

  • Para consultar un ejemplo completo de extremo a extremo del flujo de trabajo de desarrollo de trabajos JAR de Flink, vea Flink JAR jobs.

  • Realtime Compute for Apache Flink también admite trabajos SQL y Python. Para obtener orientación sobre el desarrollo, consulte Job development overview y Develop Python jobs.