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

相关推荐
不想写bug呀6 分钟前
MySQL事务介绍
数据库·mysql
亿信华辰软件11 分钟前
已经上了数据中台,还要做数据治理吗?
大数据·人工智能·数据治理
阿拉伯柠檬17 分钟前
Git原理与使用(一)
大数据·linux·git·elasticsearch·面试
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.19 分钟前
双主模式实现HTTP与MySQL高可用
网络协议·mysql·http
亿信华辰软件20 分钟前
药企客商域主数据管理实践与挑战
大数据
cheems952730 分钟前
【MySQL】SQL调优:数据库性能优化(一)
数据库·sql·mysql
snpgroupcn32 分钟前
技术实战|出海企业收并购中SAP实施商选型与系统整合策略
大数据
远方160941 分钟前
113-Oracle database26ai rpm安装和适配生产
大数据·数据库·sql·oracle·database
AC赳赳老秦1 小时前
等保2.0合规实践:DeepSeek辅助企业数据分类分级与自动化报告生成
大数据·人工智能·分类·数据挖掘·自动化·数据库架构·deepseek
qq_297574671 小时前
MySQL迁移到瀚高数据库 常用转换函数对照表(附XML示例,直接复用)
xml·数据库·mysql