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>
2. Flink DataStream 任务代码示例
在你的 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. 关键配置说明
-
MySQLSource 配置 :
在
MySqlSource中,指定了 MySQL 数据库的主机、端口、数据库名称、用户名和密码等连接信息。此外,tableList用于指定需要同步的表。 -
WatermarkStrategy :
由于 Flink 是流式处理框架,因此我们需要配置 Watermark 策略。在这里使用
noWatermarks(),表示不生成水位线。 -
启用 Checkpoint :
env.enableCheckpointing(3000)设置 Flink 程序的 checkpoint 间隔为 3 秒,确保状态一致性和容错性。 -
打印数据 :
使用
print()将结果打印到控制台,实际应用中可能会替换成其他 Sink,如 Kafka、Elasticsearch 等。
4. 打包并运行
-
构建项目 :
通过以下命令构建项目:
bashmvn clean package -
提交任务 :
构建完成后,会在
target目录下生成一个 JAR 包,你可以将其提交到 Flink 集群进行运行。
总结
本文通过 Maven 配置和 Flink DataStream 示例代码,展示了如何使用 MySQL CDC Source 连接器实时读取 MySQL 数据库的变更数据。Flink 强大的流处理能力与 CDC 连接器的结合,使得实现实时数据同步变得更加简单和高效。根据需要,你可以将数据同步到各种下游系统,如 Kafka、HDFS、Elasticsearch 等。