共计 2387 个字符,预计需要花费 6 分钟才能阅读完成。
Delta Lake 如何实现 CDC 实时入湖,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
什么是 CDC
Change Data Capture(CDC)用来跟踪捕获数据源的数据变化,并将这些变化同步到目标存储 (如数据湖或数据仓库),用于数据备份或后续分析,同步过程可以是分钟 / 小时 / 天等粒度,也可以是实时同步。CDC 方案分为侵入式(intrusive manner) 和非倾入性 (non-intrusive manner) 两种。
侵入式
侵入式方案直接请求数据源系统(如通过 JDBC 读取数据),会给数据源系统带来性能压力。常见的方案如下:
最后更新时间(Last Modified)
源表需要有修改时间列,同步作业需要指定最后修改时间参数,表明同步某个时间点之后变更的数据。该方法不能同步删除记录的变更,同一条记录多次变更只能记录最后一次。
自增 id 列
源表需要有一个自增 id 列,同步作业需要指定上次同步的最大 id 值,同步上次之后新增的记录行。该方法也不能同步删除记录的变更,而且老记录的变更也无法感知。
非侵入式
非侵入性一般通过日志的方式记录数据源的数据变化(如数据库的 binlog),源库需要开启 binlog 的功能。数据源的每次操作都会被记录到 binlog 中(如 insert/update/delete 等),能够实时跟踪数据插入 / 删除 / 数据多次更新 /DDL 操作等。
示例:
insert into table testdb.test values(hangzhou ,1);update testdb.test set b=2 where a= hangzhou update testdb.test set b=3 where a= hangzhou delete from testdb.test where a= hangzhou
通过将 binlog 日志有序的回放到目标存储中,从而实现对数据源的数据导出同步功能。
常见的 CDC 方案实现
开源常见的 CDC 方案实现主要有两种:
Sqoop 离线同步
sqoop 是一个开源的数据同步工具,它可以将数据库的数据同步到 HDFS/Hive 中,支持全量同步和增量同步,用户可以配置小时 / 天的调度作业来定时同步数据。
sqoop 增量同步是一种侵入式的 CDC 方案,支持 Last Modified 和 Append 模式。
缺点:
直接 jdbc 请求源库拉取数据,影响源库性能
小时 / 天调度,实时性不高
无法同步源库的删除操作,Append 模式还不支持数据更新操作
binlog 实时同步
binlog 日志可以通过一些工具实时同步到 kafka 等消息中间件中,然后通过 Spark/Flink 等流引擎实时的回放 binlog 到目标存储(如 Kudu/HBase 等)。
缺点:
Kudu/HBase 运维成本高
Kudu 在数据量大的有稳定性问题, HBase 不支持高吞吐的分析
Spark Streaming 实现回放 binlog 逻辑复杂,使用 java/scala 代码具有一定门槛
Streaming SQL+Delta Lake 实时入湖方案
前面介绍了两种常见的 CDC 方案,各自都有一些缺点。阿里云 E -MapReduce 团队提供了一种新的 CDC 解决方案,利用自研的 Streaming SQL 搭配 Delta Lake 可以轻松实现 CDC 实时入湖。这套解决方案同时通过阿里云最新发布的数据湖构建(Data Lake Formation,DLF)服务提供一站式的入湖体验。
Streaming SQL
Spark Streaming SQL 在 Spark Structured Streaming 之上提供了 SQL 能力,降低了实时业务开发的门槛,使得离线业务实时化更简单方便。
下面以实时消费 SLS 为例:
# 创建 loghub 源表
spark-sql CREATE TABLE loghub_intput_tbl(content string)
USING loghub
OPTIONS
(...)
# 创建 delta 目标表
spark-sql CREATE TABLE delta_output_tbl(content string)
USING delta
OPTIONS
(...);
# 创建流式 SCAN
spark-sql CREATE SCAN loghub_table_intput_test_stream
ON loghub_intput_tbl
USING STREAM;
# 将 loghub 源表数据插入 delta 目标表
spark-sql INSERT INTO delta_output_tbl SELECT content FROM loghub_table_intput_test_stream;
Delta Lake
Delta Lake 是 Databricks 开源的一种数据湖格式,它在 parquet 格式之上,提供了 ACID 事务 / 元数据管理等能力,同时相比 parquet 具有更好的性能,能够支持更丰富的数据应用场景(如数据更新 /schema 演化等)。
E-MapReduce 团队在开源 Delta Lake 基础上做了很多功能和性能的优化,如小文件合并 Optimize/DataSkipping/Zorder,SparkSQL/Streaming SQL/Hive/Presto 深度集成 Delta 等。
Streaming SQL+Delta Lake CDC 实时入湖
Spark Streaming SQL 提供了 Merge Into 的语法,搭配 Delta Lake 的实时写入能力,可以很方便的实现 CDC 实时入湖方案。
如上图所示,只需要 SQL 就能完成 CDC 实时入湖。
看完上述内容,你们掌握 Delta Lake 如何实现 CDC 实时入湖的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!