Flink CDC与Iceberg结合实现MySQL多库多表关联Sink

在大数据实时处理的场景中,如何高效地从MySQL数据库中捕捉变化(Change Data Capture,CDC),并将其持久化到数据湖中,是一个非常热门的课题。通过Flink CDC和Apache Iceberg的结合,能够实现多库多表的实时数据流转,本文将详细介绍这一方案的实现过程,并附上相关代码示例。

Flink CDC概述

Flink CDC是一种用于捕捉数据库变更事件的解决方案,可以从多种数据库(如MySQL、PostgreSQL等)实时读取数据变化。它将这些变化以事件流的形式传递,便于后续的数据处理和存储。

Iceberg简介

Apache Iceberg是一个高性能的数据湖表格式,支持多种数据处理引擎。Iceberg使得数据存储和查询更加灵活、高效,尤其适合大规模数据处理场景。

设计思路

我们的目标是从多个MySQL数据库中捕获数据变化,然后通过Flink将数据写入到Iceberg中,以便后续分析和处理。下面是系统的主要组件:

  1. MySQL:多个数据源,包括多个数据库和表。
  2. Flink CDC:捕获MySQL增量数据并处理。
  3. Apache Iceberg:作为数据湖存储,便于高效查询与分析。

以下是整个流程的序列图:

sequenceDiagram
    participant MySQL as MySQL
    participant Flink as Flink CDC
    participant Iceberg as Iceberg
    MySQL->>Flink: 数据变化事件
    Flink->>Iceberg: 写入变化数据
    Iceberg->>Iceberg: 数据更新

ER图

为了说明我们的数据模型,以下是一个简单的ER图,展示了不同表之间的关联关系。

erDiagram
    USERS {
        int id PK
        string name
    }
    ORDERS {
        int id PK
        int user_id FK
        string product
    }
    USERS ||--o{ ORDERS : places

代码示例

接下来,我们来看看如何通过Flink CDC将MySQL数据实时写入Iceberg。

Maven依赖

首先,确保你的pom.xml中添加了必要的依赖。

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-connector-mysql-cdc</artifactId>
    <version>1.14.0</version>
</dependency>
<dependency>
    <groupId>org.apache.iceberg</groupId>
    <artifactId>iceberg-flink</artifactId>
    <version>0.12.0</version>
</dependency>

Flink作业代码

下面的代码展示了如何设置Flink作业,捕获来自MySQL的数据变化并写入Iceberg。

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.connector.jdbc.JdbcSink;
import org.apache.flink.streaming.api.functions.sink.SinkFunction;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
import org.apache.flink.connector.iceberg.sink.IcebergSink;

public class FlinkCDCToIceberg {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

        // 配置Flink CDC连接MySQL
        tableEnv.executeSql(
            "CREATE TABLE users (" +
            "  id INT, " +
            "  name STRING, " +
            "  PRIMARY KEY (id) NOT ENFORCED" +
            ") WITH (" +
            "  'connector' = 'mysql-cdc', " +
            "  'hostname' = 'localhost', " +
            "  'port' = '3306', " +
            "  'username' = 'root', " +
            "  'password' = 'password', " +
            "  'database-name' = 'test_db', " +
            "  'table-name' = 'users'" +
            ")"
        );

        // Sink到Iceberg
        tableEnv.executeSql(
            "CREATE TABLE iceberg_users (" +
            "  id INT, " +
            "  name STRING" +
            ") WITH (" +
            "  'connector' = 'iceberg', " +
            "  'catalog-name' = 'mycatalog'" +
            ")"
        );

        // 使用INSERT INTO语句插入数据
        tableEnv.executeSql("INSERT INTO iceberg_users SELECT * FROM users");

        env.execute("Flink CDC to Iceberg");
    }
}

运行作业

在完成上述代码编写后,可以编译并运行Flink作业。初次运行时,该作业将从MySQL的users表中读取数据,如果有新的插入、更新、或删除,将实时反应到Iceberg表中。

结论

借助Flink CDC和Apache Iceberg的结合,用户可以轻松实现MySQL的多库多表关联的数据实时流转。这种方案不仅提高了数据处理的效率,也为大数据分析提供了灵活的支持。其通过捕获数据变化、实时同步到数据湖中,极大地促进了企业对实时数据的利用。

希望本文能够帮助你更好地理解Flink CDC与Iceberg的组合使用,提升你的数据处理能力!