Flink DataStream API 打包使用 MySQL CDC 连接器

1. Maven 配置(pom.xml 示例)

要打包 Flink DataStream 任务,首先需要配置 pom.xml 文件,确保正确引用所有必要的依赖项。以下是一个典型的 pom.xml 示例,用于构建 Flink CDC 项目:

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.apache.flink</groupId>
    <artifactId>FlinkCDCTest</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <scala.binary.version>2.12</scala.binary.version>
        <flink.version>1.17.2</flink.version>
        <slf4j.version>1.7.15</slf4j.version>
        <log4j.version>2.17.1</log4j.version>
        <debezium.version>1.9.7.Final</debezium.version>
    </properties>

    <dependencies>
        <!-- Flink dependencies -->
        <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>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-connector-mysql-cdc</artifactId>
            <version>2.4.2</version>
        </dependency>
        <dependency>
            <groupId>io.debezium</groupId>
            <artifactId>debezium-connector-mysql</artifactId>
            <version>${debezium.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <executions>
                    <execution>
                        <id>shade-flink</id>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <shadeTestJar>false</shadeTestJar>
                            <shadedArtifactAttached>false</shadedArtifactAttached>
                            <createDependencyReducedPom>true</createDependencyReducedPom>
                            <dependencyReducedPomLocation>
                                ${project.basedir}/target/dependency-reduced-pom.xml
                            </dependencyReducedPomLocation>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

在你的 Flink DataStream 任务中,你可以使用 MySQLSource 来实时读取 MySQL 数据库的变更事件。以下是一个简单的 Flink CDC 任务示例,该任务从 MySQL 数据库中读取数据,并将其打印到控制台:

java 复制代码
package org.apache.flink.flink.cdc;

import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.cdc.connectors.mysql.source.MySqlSource;
import org.apache.flink.cdc.debezium.JsonDebeziumDeserializationSchema;

public class CdcTest {
    public static void main(String[] args) throws Exception {
        // 创建 MySQL CDC Source
        MySqlSource<String> mySqlSource = MySqlSource.<String>builder()
                .hostname("yourHostname")  // MySQL 主机地址
                .port(3306)  // MySQL 端口
                .databaseList("yourDatabaseName")  // 监控的数据库
                .tableList("yourDatabaseName.yourTableName")  // 监控的表
                .username("yourUsername")  // MySQL 用户名
                .password("yourPassword")  // MySQL 密码
                .deserializer(new JsonDebeziumDeserializationSchema())  // 将源记录转换为 JSON 字符串
                .build();

        // 创建 Flink 执行环境
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 启用 checkpoint
        env.enableCheckpointing(3000);

        // 设置源数据并打印
        env
                .fromSource(mySqlSource, WatermarkStrategy.noWatermarks(), "MySQL Source")
                .setParallelism(1)  // 设置源并行度
                .print().setParallelism(1); // 使用并行度 1 确保消息顺序

        // 执行 Flink 程序
        env.execute("Print MySQL Snapshot + Binlog");
    }
}

3. 关键配置说明

  1. MySQLSource 配置

    MySqlSource 中,指定了 MySQL 数据库的主机、端口、数据库名称、用户名和密码等连接信息。此外,tableList 用于指定需要同步的表。

  2. WatermarkStrategy

    由于 Flink 是流式处理框架,因此我们需要配置 Watermark 策略。在这里使用 noWatermarks(),表示不生成水位线。

  3. 启用 Checkpoint
    env.enableCheckpointing(3000) 设置 Flink 程序的 checkpoint 间隔为 3 秒,确保状态一致性和容错性。

  4. 打印数据

    使用 print() 将结果打印到控制台,实际应用中可能会替换成其他 Sink,如 Kafka、Elasticsearch 等。

4. 打包并运行

  1. 构建项目

    通过以下命令构建项目:

    bash 复制代码
    mvn clean package
  2. 提交任务

    构建完成后,会在 target 目录下生成一个 JAR 包,你可以将其提交到 Flink 集群进行运行。

总结

本文通过 Maven 配置和 Flink DataStream 示例代码,展示了如何使用 MySQL CDC Source 连接器实时读取 MySQL 数据库的变更数据。Flink 强大的流处理能力与 CDC 连接器的结合,使得实现实时数据同步变得更加简单和高效。根据需要,你可以将数据同步到各种下游系统,如 Kafka、HDFS、Elasticsearch 等。

相关推荐
Apache Flink2 小时前
Flink Forward Asia 2025 城市巡回 · 深圳站
大数据·flink
2021_fc2 小时前
Flink入门指南:使用Java构建第一个Flink应用
java·大数据·flink
Hello.Reader2 小时前
Streaming ELT with Flink CDC · Iceberg Sink
大数据·flink
RPA机器人就选八爪鱼2 小时前
RPA财务机器人:驱动财务数字化转型的核心引擎
大数据·运维·人工智能·机器人·rpa
2021_fc2 小时前
Flink快速入门--安装与示例运行
大数据·flink
小蜗牛爱远行2 小时前
mysql导入中文乱码问题
数据库·mysql
J***Q2922 小时前
大数据存储优化策略
大数据
二进制_博客3 小时前
flume抽取kafka数据到kafka,数据无法从topicA抽取到topicB
大数据·kafka·flume
while(1){yan}4 小时前
MYSQL索引的底层数据结构
数据结构·数据库·mysql