使用 Flink CDC 连接 MySQL 数据库
Apache Flink 是一个大数据处理框架,支持流处理和批处理。在数据集成场景中,我们常常需要从数据库中读取数据,Flink CDC(Change Data Capture)就是为此而设计的,它能实时捕获数据库中的变化信息,方便流式处理。
本文将介绍如何使用 Flink CDC 从 MySQL 数据库中读取数据,并提供 Maven 配置和代码示例,帮助你快速上手。
前期准备
在开始之前,确保你已经安装了以下工具:
- JDK 1.8 或更高版本
- Apache Maven
- MySQL 数据库
- 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");
}
}
说明
- 请将
yourUsername
和yourPassword
替换为你的 MySQL 用户名和密码。 table.whitelist
参数指定监视的表,mydb.users
是我们要捕获变更的表名。
数据捕获流向
Flink CDC 通过数据流的方式捕获 MySQL 数据库中的变化。下图用饼状图展示了不同类型的数据变更类型在流处理中的分布:
pie
title 数据变更类型分布
"插入": 40
"更新": 30
"删除": 30
这表示在捕获到的变化中,插入、更新和删除操作占比各自不同。
结果输出
通过运行上述代码,你将看到实时捕捉到的 MySQL 数据库变化信息在控制台中打印出来。你可以根据需求进行后续处理,例如写入 Kafka、转存到文件系统或者进一步的流式计算等。
结论
Flink CDC 是一个强大的工具,它能够帮助我们在大数据应用中实时捕获和处理数据库的变化。通过本文中提供的 Maven 配置和简单示例代码,你可以迅速搭建起一个 Flink CDC 的工作环境。不论是监控数据库的变化,还是进行复杂的事件处理,Flink CDC 都能够为你提供便捷、高效的解决方案。希望本文能对你有所帮助,期待你在使用过程中发现更多有趣的用法和场景。