Flink-CDC 2.0学习


前言

实时数仓项目用到了Flink-CDC,这里记录一下学习的过程。


一、CDC简介

1.什么是CDC

CDC是Change Data Capture(变更数据获取)的简称。核心思想是监测并捕获数据库的变动包括数据或者数据表的插入、更新以及删除等),将这些变更按发生的完成顺序完整记录下来,写入到消息中间件以供其他服务进行订阅及消费。

2.CDC的种类

CDC主要分为基于查询和基于Binlog两种方式,如下表:

基于查询的CDC 基于Binlog的CDC
开源产品 Sqoop、Kafka JDBC Source Canal、Maxwell、Debezium
执行模式 Batch Streaming
是否可以捕获所有数据变化 否(只能查询出最终结果) 是(一条数据多次修改的中间过程也可以捕获)
延迟性 高延迟(攒成一批的,延迟高) 低延迟(类似于流式的,一条一条,延迟低)
是否增加数据库压力 是(因为要select表) 否 (是基于文件的)

3.Flink-CDC开源地址

开源地址:https://github.com/ververica/flink-cdc-connectors

二、Flink-CDC案例实操

1.依赖导入

使用Flink-CDC需要先导入以下依赖:

<dependencies>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-java</artifactId>
        <version>1.12.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-streaming-java_2.12</artifactId>
        <version>1.12.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-clients_2.12</artifactId>
        <version>1.12.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>3.1.3</version>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.49</version>
</dependency>

<dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-table-planner-blink_2.12</artifactId>
        <version>1.12.0</version>
</dependency>

<dependency>
        <groupId>com.ververica</groupId>
        <artifactId>flink-connector-mysql-cdc</artifactId>
        <
<think>嗯,用户问的是如何使用Flink-CDC实现并行读取多个数据库表的变更,需要配置和最佳实践。首先,我得回忆一下Flink-CDC的基本原理,它基于Flink框架,通过Debezium捕获数据库变更。然后,用户提到多表并发读取,这涉及到Flink的并行度设置以及如何配置多个CDC源。 首先,Flink-CDC的每个表通常对应一个独立的Source,所以可能需要为每个表创建单独的CDC源。然后,Flink的并行度设置是关键,每个Source的并行度可以调整,但要注意数据库的连接数限制,避免给源数据库造成太大压力。 接下来,用户可能需要配置多表读取,比如使用Flink SQL的方式,通过正则表达式匹配多个表,或者用DataStream API分别读取每个表。比如在Flink SQL中,可以设置table-name参数为db.schema.table*这样的模式,或者用正则表达式来匹配多个表名。不过需要注意,不同的数据库可能对正则表达式的支持不同,比如MySQL可能需要使用正则表达式,而PostgreSQL可能使用不同的模式匹配方式。 然后,并行度的优化。每个CDC Source默认并行度是1,但如果表的数据量大,可能需要增加并行度。但像MySQL的CDC源,并行度大于1的话需要配置split参数,比如scan.incremental.snapshot.chunk.size,把表分成多个块来并行读取。不过分块可能会影响一致性,需要根据业务场景权衡。 另外,最佳实践方面,需要考虑数据库的负载,合理分配资源,避免过多连接。监控也是重要的,比如通过Flink的Web UI或日志观察延迟和吞吐量。还有checkpoint的设置,确保容错性,避免数据丢失。 然后,用户的问题可能需要示例代码。用DataStream API的话,可以创建多个MySQLSource,然后union到一起,再设置并行度。用SQL的话,可能需要定义多个表,或者使用正则表达式匹配多个表,然后进行联合查询。 还要注意Flink-CDC的版本,不同版本的配置参数可能有差异,比如Flink CDC 2.0以上可能支持更灵活的分片配置。同时,处理不同数据库时,比如SQL Server或Oracle,配置方式可能不同,需要参考对应文档。 最后,用户可能想了解如何验证和监控多表读取的效果,比如观察Flink作业的并行任务数,或者通过日志查看各个表的处理情况。此外,可能需要处理schema变更,比如表结构变化时如何应对,但Flink-CDC可能自动处理,或者需要额外配置。 总结一下,回答需要涵盖配置多个CDC源的方法,并行度调整,示例代码(DataStream和SQL两种方式),最佳实践包括资源管理、监控、checkpoint,以及注意事项如数据库连接数、版本差异等。还要引用提供的参考内容,比如引用[1]提到Flink-CDC捕获变更数据,引用[3]提到测试新增数据的例子,可以结合这些来支持回答。</think>### 如何配置Flink-CDC实现多表并发读取 #### 1. 多表并发读取的核心原理 Flink-CDC通过为每个表创建独立的变更数据捕获(CDC)源实现多表读取。每个CDC源可以独立设置并行度,结合Flink的并行计算能力实现并发处理。对于MySQL等数据库,Flink-CDC底层使用Debezium引擎进行日志解析[^1]。 #### 2. 配置实现步骤(以MySQL为例) **2.1 DataStream API方式** ```java // 创建多个表的CDC源 MySQLSource<String> source1 = MySQLSource.<String>builder() .hostname("localhost") .port(3306) .databaseList("db1") .tableList("db1.table1") // 指定表1 .username("user") .password("pass") .deserializer(new StringDebeziumDeserializationSchema()) .build(); MySQLSource<String> source2 = MySQLSource.<String>builder() .hostname("localhost") .port(3306) .databaseList("db1") .tableList("db1.table2") // 指定表2 .username("user") .password("pass") .deserializer(new StringDebeziumDeserializationSchema()) .build(); // 合并源并设置并行度 DataStreamSource<String> stream1 = env.fromSource( source1, WatermarkStrategy.noWatermarks(), "MySQL-Source1"); DataStreamSource<String> stream2 = env.fromSource( source2, WatermarkStrategy.noWatermarks(), "MySQL-Source2"); stream1.union(stream2) .setParallelism(4) // 总并行度 .print(); ``` **2.2 SQL方式(支持正则匹配)** ```sql CREATE TABLE cdc_source ( -- 表结构定义 ) WITH ( 'connector' = 'mysql-cdc', 'hostname' = 'localhost', 'port' = '3306', 'username' = 'user', 'password' = 'pass', 'database-name' = 'db1', 'table-name' = 'table_[0-9]+', -- 正则匹配多个表 'scan.incremental.snapshot.enabled' = 'true' ); ``` #### 3. 并行度优化策略 | 配置项 | 作用说明 | 推荐值 | |---------------------------|---------------------------------|--------| | parallelism.default | 默认并行度 | 根据TaskManager核心数设置 | | scan.incremental.snapshot.chunk.size | 表分片大小(影响并行度上限) | 1000 | | scan.snapshot.fetch.size | 单次读取数据量 | 1024 | #### 4. 最佳实践 1. **分库分表场景**:使用正则表达式`db*.table*`匹配多个数据库/表,但需确保数据库账号有全局权限 2. **动态表发现**:启用`scan.tables.regex`参数自动发现新增表(需Flink CDC 2.3+版本) 3. **资源隔离**:为高吞吐表单独配置Source,避免相互影响 4. **状态管理**:启用Checkpoint保证Exactly-Once语义 ```java env.enableCheckpointing(5000); // 5秒间隔 ``` #### 5. 注意事项 1. 数据库连接数限制:并行度不宜超过数据库最大连接数的50% 2. 主键要求:所有表必须包含主键才能正确捕获变更[^3] 3. 网络带宽:跨机房部署时需考虑数据传输延迟 4. 版本兼容性:确认Flink CDC版本与数据库版本匹配(如MySQL 8.x需要CDC 2.2+) #### 6. 监控指标 通过Flink Web UI监控以下核心指标: - `numRecordsInPerSecond`: 每秒处理记录数 - `currentFetchEventTimeLag`: 数据延迟时间 - `sourceIdleTime`: 源空闲时间(应小于Checkpoint间隔)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值