Delta Lake如何实现CDC实时入湖

80次阅读
没有评论

共计 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 行业资讯频道,感谢各位的阅读!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计2387字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)