使用 FlinkCDC 读取 MySQL 多张表的简单指南

随着大数据和实时处理技术的快速发展,Apache Flink 和 FlinkCDC(Flink Change Data Capture)逐渐成为数据处理领域的重要工具。FlinkCDC能够高效地从关系型数据库中读取变更数据,使得数据流的实时处理变得更加简单。本文将介绍如何使用FlinkCDC从MySQL中读取多张表的数据,包括代码示例和配置步骤。

什么是 FlinkCDC?

FlinkCDC 是 Apache Flink 的一个扩展,专门用于读取数据库的变更数据。它基于 Debezium 这样的技术,可以实时捕获数据的插入、更新和删除操作。这种特性适用于需要获取数据即时变化的场景,如实时数据分析和ETL(提取、转换和加载)。

环境准备

在开始使用FlinkCDC之前,需要准备一些基本环境:

  • 已安装MySQL数据库并创建相应的数据库和表。
  • 在您的系统上安装Apache Flink。
  • 加入FlinkCDC所需的依赖库。

示例 MySQL 数据库设置

这里假设我们有一个名为 test_db 的数据库,并且在其中有两张表:userorder。表结构如下:

  1. user

    CREATE TABLE user (
        id INT PRIMARY KEY AUTO_INCREMENT,
        name VARCHAR(255),
        email VARCHAR(255)
    );
    
  2. order

    CREATE TABLE `order` (
        id INT PRIMARY KEY AUTO_INCREMENT,
        user_id INT,
        amount DECIMAL(10, 2),
        FOREIGN KEY (user_id) REFERENCES user(id)
    );
    

引入 FlinkCDC 依赖

在您的 Maven 项目的 pom.xml 文件中添加如下依赖:

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-connector-jdbc_2.12</artifactId>
    <version>1.14.0</version>
</dependency>
<dependency>
    <groupId>com.hazelcast</groupId>
    <artifactId>hazelcast-spring</artifactId>
    <version>3.11</version>
</dependency>
<dependency>
    <groupId>debezium</groupId>
    <artifactId>debezium-connector-mysql</artifactId>
    <version>1.8.0</version>
</dependency>

FlinkCDC 中读取 MySQL 多张表

下面是一个使用FlinkCDC读取MySQL数据库中的多张表的示例代码:

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.connector.jdbc.JdbcInputFormat;
import org.apache.flink.streaming.api.functions.source.SourceFunction;

public class FlinkCDCExample {
    public static void main(String[] args) throws Exception {
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 启动 MySQL 读取,读取 user 表的变更
        DataStream<String> userStream = env.addSource(
            JdbcInputFormat.buildJdbcInputFormat()
                    .setDrivername("com.mysql.cj.jdbc.Driver")
                    .setDBUrl("jdbc:mysql://localhost:3306/test_db")
                    .setUsername("username")
                    .setPassword("password")
                    .setQuery("SELECT * FROM user")
                    .setRowTypeInfo(...)
                    .build()
        );

        // 启动 MySQL 读取,读取 order 表的变更
        DataStream<String> orderStream = env.addSource(
            JdbcInputFormat.buildJdbcInputFormat()
                    .setDrivername("com.mysql.cj.jdbc.Driver")
                    .setDBUrl("jdbc:mysql://localhost:3306/test_db")
                    .setUsername("username")
                    .setPassword("password")
                    .setQuery("SELECT * FROM order")
                    .setRowTypeInfo(...)
                    .build()
        );

        // 处理逻辑
        userStream.print();
        orderStream.print();

        env.execute("FlinkCDC MySQL Example");
    }
}

在代码中,首先导入所需的包并创建 StreamExecutionEnvironment。然后,分别为 userorder 表设置 JdbcInputFormat 来读取数据。最后,通过 print() 方法输出数据流中的内容。

结论

FlinkCDC 提供了一种高效的方式来实时读取 MySQL 数据库的变更。通过以上示例,我们可以看到如何设置数据库、依赖以及代码实现。只需简单的几步,就可以通过FlinkCDC实现从MySQL多表的数据读取,进而实现复杂的实时数据处理任务。

希望这篇文章能帮助您理解如何使用 FlinkCDC 读取 MySQL 多张表,后续您可以根据自己的需求扩展具体的处理逻辑。这只是一个开始,真正的功能和优势在于实时数据流结合业务场景所能带来的价值。