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

相关推荐
xier_ran1 分钟前
【第二周】 RAG与Agent实战05:提示词优化案例_金融文本分析
大数据·人工智能·语言模型·金融
尋有緣2 分钟前
Spark SQL 调优
大数据·sql·spark
zhang2008l2 分钟前
Python大数据可视化:基于大数据技术的共享单车数据分析与辅助管理系统_flask+hadoop+spider
大数据·python·信息可视化
qq_4371006612 分钟前
ElasticSearch相关记录
大数据·前端·javascript·elasticsearch·全文检索
逸Y 仙X12 分钟前
文章六:ElasticSearch 映射配置与字段类型详解
大数据·elasticsearch·搜索引擎
花间相见16 分钟前
【知识库笔记管理】—— 使用PARA方法高效建立自己个人知识库
大数据·笔记
冬至喵喵18 分钟前
Apache Flink 漫谈系列
大数据·flink
顶点多余21 分钟前
mysql---索引特征 (重要)
数据库·mysql
V搜xhliang024627 分钟前
开发环境搭建(Ubuntu+ROS2+Isaac Sim)
大数据·人工智能·深度学习·机器学习·自然语言处理·机器人
楼兰胡杨31 分钟前
MySQL不推荐使用UUID等字符串做主键
mysql·面试题