使用 Flink CDC 连接 MySQL 数据库

Apache Flink 是一个大数据处理框架,支持流处理和批处理。在数据集成场景中,我们常常需要从数据库中读取数据,Flink CDC(Change Data Capture)就是为此而设计的,它能实时捕获数据库中的变化信息,方便流式处理。

本文将介绍如何使用 Flink CDC 从 MySQL 数据库中读取数据,并提供 Maven 配置和代码示例,帮助你快速上手。

前期准备

在开始之前,确保你已经安装了以下工具:

  1. JDK 1.8 或更高版本
  2. Apache Maven
  3. MySQL 数据库
  4. Apache Flink

Maven 依赖配置

在你的 Maven 项目的 pom.xml 文件中,加入以下依赖项:

<dependencies>
    <!-- Flink CDC MySQL依赖 -->
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-connector-mysql-cdc_2.12</artifactId>
        <version>2.3.0</version>
    </dependency>
    <!-- Flink Streaming Java API -->
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-streaming-java_2.12</artifactId>
        <version>2.3.0</version>
    </dependency>
    <!-- Flink Core -->
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-core</artifactId>
        <version>2.3.0</version>
    </dependency>
</dependencies>

请根据实际需要修改版本号。

示例代码

接下来是一个简单的示例代码,它从 MySQL 数据库读取数据并打印输出。这段代码连接到 MySQL 数据库,捕获指定表的变化,并将结果打印到控制台。

import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import io.debezium.connector.mysql.MySqlConnector;
import io.debezium.schema.Schema;
import io.debezium.data.Envelope;
import io.debezium.embedded.EmbeddedEngine;
import io.debezium.embedded.spi.SourceInfo;
import io.debezium.embedded.spi.Offsets;

import java.util.Properties;

public class FlinkCdcMySql {
    public static void main(String[] args) throws Exception {
        // 创建流执行环境
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 配置MySQL连接
        Properties properties = new Properties();
        properties.setProperty("name", "mysql-cdc-source");
        properties.setProperty("connector.class", MySqlConnector.class.getName());
        properties.setProperty("tasks.max", "1");
        properties.setProperty("snapshot.mode", "initial");
        properties.setProperty("database.hostname", "localhost");
        properties.setProperty("database.port", "3306");
        properties.setProperty("database.user", "yourUsername");
        properties.setProperty("database.password", "yourPassword");
        properties.setProperty("database.server.id", "184054");
        properties.setProperty("database.server.name", "mydb");
        properties.setProperty("table.whitelist", "mydb.users"); // 观察的表

        // 读取数据并打印
        env
            .addSource(new MySqlSource<>())
            .map(row -> row.toString())
            .print();

        // 执行任务
        env.execute("Flink CDC MySQL Examples");
    }
}

说明

  1. 请将 yourUsernameyourPassword 替换为你的 MySQL 用户名和密码。
  2. table.whitelist 参数指定监视的表,mydb.users 是我们要捕获变更的表名。

数据捕获流向

Flink CDC 通过数据流的方式捕获 MySQL 数据库中的变化。下图用饼状图展示了不同类型的数据变更类型在流处理中的分布:

pie
    title 数据变更类型分布
    "插入": 40
    "更新": 30
    "删除": 30

这表示在捕获到的变化中,插入、更新和删除操作占比各自不同。

结果输出

通过运行上述代码,你将看到实时捕捉到的 MySQL 数据库变化信息在控制台中打印出来。你可以根据需求进行后续处理,例如写入 Kafka、转存到文件系统或者进一步的流式计算等。

结论

Flink CDC 是一个强大的工具,它能够帮助我们在大数据应用中实时捕获和处理数据库的变化。通过本文中提供的 Maven 配置和简单示例代码,你可以迅速搭建起一个 Flink CDC 的工作环境。不论是监控数据库的变化,还是进行复杂的事件处理,Flink CDC 都能够为你提供便捷、高效的解决方案。希望本文能对你有所帮助,期待你在使用过程中发现更多有趣的用法和场景。