LakeSoul CDC表格式详解:实现低延迟数据变更捕获
什么是CDC表格式
CDC(Change Data Capture,变更数据捕获)是数据湖架构中重要的数据来源。LakeSoul的CDC表格式设计目标是将在线OLTP数据库的变更以极低延迟(通常只需几分钟)同步到数据湖中,使下游分析应用能够实时获取最新结果,而无需依赖传统的T+1数据库全量导出方式。与普通表相比,CDC表格式增加了对删除操作的支持。
CDC表格式工作原理
LakeSoul通过一个额外的变更操作列(列名可配置)来建模CDC数据。这个列应为字符串类型,包含三种值之一:
insert
:表示新增记录update
:表示更新记录delete
:表示删除记录
在数据读取时,LakeSoul会根据这个标记自动处理变更:
- 批处理读取时:保留最新的
insert
和update
数据,自动过滤delete
记录 - 流式增量读取时:保留所有变更标记(包括
delete
),在Flink中这些标记会自动转换为RowData对象的RowKind字段
创建CDC表
在Spark中创建CDC表
使用Scala API
import com.dmetasoul.lakesoul.tables.LakeSoulTable
LakeSoulTable.createTable(data, path)
.shortTableName("cdc_ingestion")
.hashPartitions("id")
.hashBucketNum(2)
.rangePartitions("rangeid")
.tableProperty("lakesoul_cdc_change_column" -> "change_type")
.create()
使用SQL
CREATE TABLE table_name (id string, date string, change_type string) USING lakesoul
PARTITIONED BY (date)
LOCATION 's3://lakesoul-bucket/table_path'
TBLPROPERTIES(
'lakesoul_cdc_change_column'='change_type',
'hashPartitions'='id',
'hashBucketNum'='2'
);
重要说明:
- CDC表必须定义主键,且应与源OLTP表的主键保持一致
- 通过
lakesoul_cdc_change_column
属性指定变更标记列 - 建议合理设置hash分区和范围分区以提高查询效率
在Flink中创建CDC表
Flink环境下创建CDC表需要配置相应的连接器参数,确保变更标记列能正确映射到Flink的RowKind类型。具体配置方法可参考Flink连接器文档。
CDC表增量读取
LakeSoul采用主键分片模式处理增量更新,写入时增量数据不需要与存量数据合并。对于CDC表,增量数据就是原始CDC流的内容。
Spark流式读取
从2.2.0版本开始,Spark支持CDC表的增量流式读取,可以完整保留CDC操作标记。
Flink流式读取
从2.3.0版本开始,Flink Table Source支持:
- 完整的变更日志流语义
- 增量读取和写入
- 自动将CDC标记转换为Flink RowKind
最佳实践建议
-
变更标记列命名:建议使用有明确业务含义的列名,如
op_type
、change_flag
等 -
主键设计:
- 确保与源数据库主键一致
- 复合主键情况下,所有主键字段都需包含在表中
-
性能优化:
- 根据数据量和查询模式合理设置hashBucketNum
- 频繁查询的字段可设置为range分区字段
-
数据一致性:
- 确保CDC源数据的有序性
- 考虑设置合理的watermark处理延迟数据
-
监控与告警:
- 监控CDC同步延迟
- 设置变更记录异常检测机制
典型应用场景
-
实时数仓:将业务数据库变更实时同步到数据湖,构建实时分析能力
-
数据同步:实现跨系统、跨地域的数据实时同步
-
审计追溯:保留完整的数据变更历史,满足合规要求
-
事件驱动架构:基于数据变更触发下游处理流程
通过LakeSoul的CDC表格式,企业可以构建真正实时的数据湖架构,消除传统批处理带来的数据延迟,为实时决策提供数据支撑。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考