flink 1.18 cdc 2.4.2 读 mysql binlog 写 kafka jar版本依赖

一.背景

        在企业级数据架构中,实时数据同步是打通 “业务操作层” 与 “数据应用层” 的关键链路,而 MySQL 作为主流的关系型数据库,其产生的业务数据(如交易记录、用户操作、订单状态变更等)是实时数据处理的核心来源。Apache Flink CDC(Change Data Capture)凭借其 “无侵入式采集、低延迟同步、全量 + 增量一体化” 的特性,成为 MySQL 数据实时捕获的优选方案,能够精准解析 MySQL binlog 日志,将数据变更(插入、更新、删除)实时同步至下游系统,为实时风控、数据仓库增量同步、实时报表等场景提供数据支撑。

        Kafka 作为高性能的分布式消息队列,具备高吞吐、高可用、可持久化等优势,是实时数据链路中的核心 “数据总线”,能够承接 Flink CDC 同步的海量变更数据,并为下游多个消费端(如 Flink 流处理、Spark 批处理、实时分析引擎)提供高并发的数据分发服务。因此,“Flink CDC 读取 MySQL binlog 并写入 Kafka” 成为企业实时数据同步的经典架构,广泛应用于金融、电商、物流等行业的核心业务场景。

        然而,在该架构落地过程中,版本依赖适配是开发者面临的核心痛点之一:

  1. 组件版本兼容性复杂:Flink CDC 与 Flink 内核、MySQL 驱动、Kafka 客户端、序列化框架(如 Avro、JSON)等组件存在严格的版本依赖关系,尤其是 Flink CDC 2.4.2 作为稳定版,对 Flink 主版本(如 1.17.x、1.18.x)、Kafka 客户端版本(如 2.8.x、3.0+)有明确适配要求,版本不匹配会直接导致 binlog 解析失败、Kafka 写入超时、序列化异常等问题;
  2. 依赖冲突频发:不同组件的依赖包(如 guavanettyjackson 等)可能存在版本差异,若手动管理依赖,易出现类加载冲突、方法不存在等运行时异常,尤其在打包部署为 Jar 包时,需处理繁琐的依赖排除与引入逻辑;
  3. 生产环境稳定性要求高:企业级应用对数据同步的可靠性、一致性要求极高,依赖版本的不规范可能导致数据丢失、重复同步、作业频繁重启等问题,严重影响业务连续性;
  4. 开发效率低下:开发者需花费大量时间查阅官方文档、验证版本组合、排查依赖冲突,尤其是新手用户易因依赖配置错误导致项目无法运行,阻碍开发进度。

        因此,明确 Flink CDC 2.4.2 读取 MySQL binlog 并写入 Kafka 场景下的标准化 Jar 版本依赖,是保障数据同步链路稳定、降低开发与运维成本的关键前提。合理的依赖配置不仅能避免版本兼容问题,还能确保 binlog 解析的准确性、Kafka 写入的高效性,为后续作业部署、扩容、维护提供可靠基础,对企业实时数据架构的落地与稳定运行具有重要的工程实践价值。

二.版本依赖

antlr4-runtime-4.8.jar
chdfs_hadoop_plugin_network-3.1.jar
commons-codec-1.4.jar
commons-lang-2.6.jar
commons-lang3-3.12.0.jar
commons-pool2-2.10.0.jar
connect-api-3.2.0.jar*
connect-json-3.2.0.jar*
curator-client-2.12.0.jar
curator-framework-2.12.0.jar
curator-recipes-2.12.0.jar
debezium-api-1.9.7.Final.jar
debezium-core-1.9.7.Final.jar
debezium-ddl-parser-1.9.7.Final.jar
fastjson-1.2.61.jar
flink-cep-1.18.1.jar
flink-connector-debezium-2.4.2.jar
flink-connector-files-1.18.1.jar
flink-connector-kafka-3.0.2-1.18.jar
flink-connector-mysql-cdc-2.4.2.jar
flink-csv-1.18.1.jar
flink-dep-debezium-connector-mysql-1.9.7.Final.jar(由debezium-connector-mysql-1.9.7.Final.jar改名)
flink-dist_2.12-1.18.1.jar
flink-json-1.18.1.jar
flink-metrics-prometheus-1.16.3.jar
flink-scala_2.12-1.18.1.jar
flink-shaded-guava-30.1.1-jre-15.0.jar
flink-shaded-zookeeper-3-3.8.3-18.0.jar
flink-table-api-java-uber-1.18.1.jar
flink-table-planner-loader-1.18.1.jar
flink-table-runtime-1.18.1.jar
gson-2.8.6.jar
guava-31.1-jre.jar
hadoop-client-api-3.3.4.jar
hadoop-client-runtime-3.3.4.jar
hadoop-cos-3.1.0-8.2.4.jar
HikariCP-4.0.3.jar
httpclient-4.5.6.jar
httpcore-4.4.16.jar
jackson-annotations-2.12.7.jar
jackson-core-2.12.7.jar*
jackson-databind-2.12.7.2.jar
jedis-3.7.0.jar
joda-time-2.12.5.jar
kafka-clients-2.4.1.jar
log4j-1.2-api-2.17.1.jar
log4j-api-2.17.1.jar
log4j-core-2.17.1.jar
log4j-slf4j-impl-2.17.1.jar
mysql-binlog-connector-java-0.27.2.jar
mysql-connector-j-8.0.33.jar
zookeeper-3.4.14.jar
zstd-jni-1.5.2-4.jar

        上述版本经过调测可以正常运行

<think>我们正在使用Flink 1.17版本,并且需要配置MySQL CDC连接器来实现实时数据同步。根据引用[1]的信息,我们知道在Flink 1.17.1中,需要两个关键jar包:mysql-connector-java(JDBC驱动)和flink-sql-connector-mysql-cdcCDC连接器)。同时,引用[1]也提到了flink-sql-connector-mysql-cdc是一个fat jar,包含了所有依赖,方便在SQL客户端使用。 步骤: 1. 下载所需jar包: - mysql-connector-java-8.0.27.jar(根据引用[1],版本为8.0.27) - flink-sql-connector-mysql-cdc-2.4.2.jar(注意:2.4.2版本对应Flink 1.17,但需确认兼容性。根据Flink CDC官方文档,Flink CDC版本Flink版本有对应关系,这里我们使用2.4.x版本支持Flink 1.17) 2. 将这两个jar包放入Flink安装目录的lib文件夹下。 3. 重启Flink集群: ```bash ./bin/stop-cluster.sh ./bin/start-cluster.sh ``` 4. 使用Flink SQL客户端或者编程序来使用MySQL CDC。 下面分别介绍两种方式:SQL客户端方式和DataStream API方式(使用Flink SQL的Table API)。 ### 方式一:使用Flink SQL客户端 启动SQL客户端: ```bash ./bin/sql-client.sh ``` 然后,在SQL客户端中执行以下DDL语句来创建MySQL CDC源表: ```sql CREATE TABLE mysql_cdc_source ( id INT, name STRING, email STRING, PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'mysql-cdc', 'hostname' = 'localhost', 'port' = '3306', 'username' = 'root', 'password' = 'yourpassword', 'database-name' = 'testdb', 'table-name' = 'user_table' ); ``` 这样就可以像查询普通表一样查询这个CDC表,它会实时捕获MySQL中`user_table`表的变更(插入、更新、删除)。 ### 方式二:使用DataStream API(Java示例) 如果需要编程序,可以使用Flink的DataStream API。但注意,引用[2]中提到了一个过时的包(com.alibaba.ververica),这是老版本Flink CDC(由阿里开源,现在已进入Apache项目)。在Flink 1.17中,我们应该使用官方的`flink-connector-cdc`包。 首先,在项目的pom.xml中添加依赖(如果使用Maven): ```xml <dependency> <groupId>com.ververica</groupId> <artifactId>flink-connector-mysql-cdc</artifactId> <version>2.4.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.27</version> </dependency> ``` 然后,编Java程序: ```java import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.api.functions.source.SourceFunction; import com.ververica.cdc.debezium.JsonDebeziumDeserializationSchema; import com.ververica.cdc.connectors.mysql.MySqlSource; public class MySqlCDCExample { public static void main(String[] args) throws Exception { SourceFunction<String> sourceFunction = MySqlSource.<String>builder() .hostname("localhost") .port(3306) .databaseList("testdb") // 设置数据库 .tableList("testdb.user_table") // 设置表 .username("root") .password("yourpassword") .deserializer(new JsonDebeziumDeserializationSchema()) // 将变更事件转换为JSON字符串 .build(); StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.addSource(sourceFunction).print().setParallelism(1); // 设置并行度为1,方便输出 env.execute("MySQL CDC Example"); } } ``` 注意:这里使用了`JsonDebeziumDeserializationSchema`,它将变更事件转换为JSON字符串,方便我们查看。 ### 注意事项 - 确保MySQLbinlog已启用。在MySQL配置文件中(如my.cnf)添加: ``` server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog_format = ROW binlog_row_image = FULL expire_logs_days = 10 ``` 然后重启MySQL服务。 - 确保MySQL用户有复制权限(REPLICATION SLAVE, REPLICATION CLIENT)。 ### 实时数据同步示例 假设我们要将MySQL中的表实时同步到另一个数据库(如ClickHouse)或消息队列(如Kafka),可以在Flink作业中定义源表(MySQL CDC)和目标表,然后通过INSERT INTO语句将数据实时入目标表。 例如,同步到Kafka: ```sql CREATE TABLE kafka_sink ( id INT, name STRING, email STRING ) WITH ( 'connector' = 'kafka', 'topic' = 'user_topic', 'properties.bootstrap.servers' = 'localhost:9092', 'format' = 'json' ); INSERT INTO kafka_sink SELECT * FROM mysql_cdc_source; ``` 这样,任何对MySQL源表的变更都会实时Kafka。 ### 总结 通过以上步骤,我们可以在Flink 1.17中配置并使用MySQL CDC连接器实现实时数据同步。关键点包括:下载正确的jar包、启用MySQLbinlog、创建CDC源表、将数据同步到目标系统。 [^1]: Flink1.17.1本地单节点部署,并支持连接mysql-cdc。根据Flink官方文档,要使用mysql-cdc连接器,需要配置的JDBC Driver的版本为8.0.27。从maven仓库中下载mysql-connector-java-8.0.27.jar,上传到Flink的lib目录。下载flink-sql-connector-mysql-cdc-2.4.2.jar,上传到lib目录。重启flink集群。 [^2]: mysql cdc_FlinkMysql数据CDC。介绍了使用MySQLSource构建DataStream源。 §§相关问题§§ 1. 如何验证Flink MySQL CDC连接器是否正常工作? 2.Flink CDC中如何处理MySQL表结构变更(如添加列)? 3. Flink CDC支持哪些类型的数据库? 4. Flink CDC在同步数据时如何保证Exactly-Once语义?</think>### Flink 1.17 MySQL CDC 配置与实时数据同步指南 #### **1. 环境准备** - **下载依赖包**(需与Flink 1.17兼容): - MySQL JDBC驱动:[mysql-connector-java-8.0.27.jar](https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.27) - MySQL CDC连接器:[flink-sql-connector-mysql-cdc-2.4.2.jar](https://mvnrepository.com/artifact/com.ververica/flink-sql-connector-mysql-cdc/2.4.2) - **部署到Flink**: ```bash # 将JAR包放入Flink的lib目录 cp mysql-connector-java-8.0.27.jar flink-sql-connector-mysql-cdc-2.4.2.jar /path/to/flink-1.17.1/lib/ # 重启集群 ./bin/stop-cluster.sh ./bin/start-cluster.sh ``` #### **2. MySQL 配置** - **启用Binlog**(在MySQL配置文件 `my.cnf` 中): ```ini server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog_format = ROW binlog_row_image = FULL ``` - **创建MySQL用户并授权**: ```sql CREATE USER 'flink_user'@'%' IDENTIFIED BY 'Password123!'; GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'flink_user'@'%'; FLUSH PRIVILEGES; ``` #### **3. Flink SQL 实时同步示例** ```sql -- 创建MySQL CDC源表(捕获变更数据) CREATE TABLE mysql_source ( id INT PRIMARY KEY, name STRING, email STRING ) WITH ( 'connector' = 'mysql-cdc', 'hostname' = 'localhost', 'port' = '3306', 'username' = 'flink_user', 'password' = 'Password123!', 'database-name' = 'test_db', 'table-name' = 'users' ); -- 创建Kafka目标表(存储变更数据) CREATE TABLE kafka_sink ( id INT, name STRING, email STRING ) WITH ( 'connector' = 'kafka', 'topic' = 'user_updates', 'properties.bootstrap.servers' = 'localhost:9092', 'format' = 'json' ); -- 启动实时同步任务 INSERT INTO kafka_sink SELECT * FROM mysql_source; ``` #### **4. 关键参数说明** | 参数 | 说明 | |------|------| | `connector` | 固定值 `mysql-cdc` | | `scan.startup.mode` | 初始快照模式(`initial`/`latest-offset`) | | `server-time-zone` | MySQL时区(例如 `Asia/Shanghai`) | | `debezium.snapshot.mode` | 快照模式(默认 `initial`) | #### **5. 验证数据同步** - **向MySQL插入数据**: ```sql INSERT INTO test_db.users(id, name, email) VALUES (1, 'Alice', 'alice@example.com'); ``` - **检查Kafka输出**: ```json {"id":1,"name":"Alice","email":"alice@example.com"} ``` #### **6. 高级场景** - **处理表结构变更**: CDC自动同步ALTER TABLE操作,但需确保目标存储支持动态Schema(如Kafka+Schema Registry)。 - **Exactly-Once保证**: 启用Flink Checkpoint(间隔建议10s~30s): ```sql SET 'execution.checkpointing.interval' = '10s'; ``` > **注意**: > - 使用 `flink-sql-connector-mysql-cdc`(而非 `flink-connector-mysql-cdc`)简化依赖管理[^1] > - CDC支持 **INSERT/UPDATE/DELETE** 事件捕获,通过`op`字段标识操作类型(`c`=插入, `u`=更新, `d`=删除)[^2] [^1]: Flink官网说明:`flink-sql-connector-mysql-cdc`是Flink SQL专用的Fat JAR,包含所有依赖。 [^2]: Debezium数据格式规范:变更事件包含`before`(旧值)和`after`(新值)字段。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路边草随风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值