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 等。

相关推荐
智途 Tech12 分钟前
2026年分析多个Excel、CSV和网页数据的AI工具清单:Tabbit 浏览器多源引用
大数据·人工智能·excel
龙亘川33 分钟前
数智赋能退役军人服务:V1.0 系统搭建全生命周期闭环服务体系
大数据·数据库·人工智能
Tongzhi20262 小时前
通芝科技考勤软件三大发展趋势:AI大模型、无感识别与数据底座
大数据·科技·算法·爬山算法
智购科技自动售卖机厂家2 小时前
2026自动售货机库存热力图分析:从设备分布到补货优先级的数据可视化实践~YH
大数据·python·信息可视化
SelectDB技术团队2 小时前
Apache Doris 5.0 年度版本前瞻(一):构建统一的多模湖仓实时分析平台
大数据·doris·数据湖·湖仓一体·lakehouse·湖仓分析·多模分析
eBest数字化转型方案2 小时前
Route Optimization for FMCG:多目标排线算法的工程实现
大数据·人工智能·算法
Han.miracle2 小时前
Elasticsearch深度分页问题完整解析
大数据·elasticsearch·搜索引擎
小柯南敲键盘2 小时前
跨境电商批量图片翻译与视频字幕翻译,就用跨马AI工具
大数据·人工智能·python·音视频
JavaPub-rodert2 小时前
Redis 和 MySQL 如何保证数据一致性?从业务方案到底层原理完整讲解
数据库·redis·mysql
GlobalInfo2 小时前
正文回答“是什么”,附录回答“为什么是这样”
大数据·人工智能