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

相关推荐
微三云-张梅1 小时前
东莞企业做GEO:AI信任体系的三个建设层级
大数据·人工智能·微三云geo·东莞系统开发·东莞geo
冰暮流星2 小时前
mysql之分组查询
数据库·mysql
美狐美颜sdk3 小时前
直播APP开发技术架构解析:从音视频流到第三方美颜SDK接入的完整方案
大数据·人工智能·音视频·美颜sdk·美颜api
NiceCloud喜云3 小时前
腾讯云国际版云数据库选型:MySQL、Redis 怎么按业务架构来判断
数据库·mysql·腾讯云
ew452183 小时前
MySQL JOIN 关联语法、差异、标准用法、经典坑点汇总
数据库·mysql
Capricorn19884 小时前
知芽研究问题看板无法推进?从孵化区到笔记的机制排查指南
大数据·论文阅读·人工智能·笔记·学习方法·论文笔记
凡科网小帆4 小时前
2026小程序商城平台哪家强,小程序商城平台选型怎么做
大数据·小程序·小程序商城平台
睿本云4 小时前
从“有数据”到“会用数据”,一次标签体系的升级能带来的改变
大数据·人工智能
牛奶咖啡134 小时前
大数据Hadoop运维应用实践——Hadoop平台常见问题与故障汇总、系统调优、网络规划与硬件存储选型
大数据·hadoop·hadoop集群操作系统调优·hadoop集群运维问题汇总·hadoop集群硬件规划·大数据平台网络规划·大数据平台硬件存储选型
MEIXIFU15 小时前
便利店实际经营面积怎么选最合适
大数据·人工智能·物联网·生活·迭代加深