Debezium发布历史112

原文地址: https://debezium.io/blog/2021/10/20/using-debezium-create-data-lake-with-apache-iceberg/

欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯.

利用德贝兹和阿帕奇冰山一起创建一个数据湖

到2021年10月20日 伊斯梅尔·西姆塞克

脱贝唑 冰原 数据蛋糕 湖边小屋

如今,为分析、报告或机器学习需求建立数据库是一种常见的做法。

在这篇博文中,我们将描述一个建立数据湖的简单方法。该解决方案使用的是基于Debezns的实时数据管道,支持酸事务、SQL更新,并且具有高度的可伸缩性。也不需要阿帕奇卡夫卡或阿帕奇火花应用程序来构建数据提要,从而降低了整个解决方案的复杂性。

让我们先简单描述一下数据湖的概念: 数据湖 通常是一个中央存储的数据,包括原始的源系统数据、传感器数据、社会数据等"。您可以按原样存储数据,不必首先处理数据,然后运行不同类型的分析。

德贝兹服务器冰山

由于操作数据通常存在于关系数据库或Nosql数据存储中,问题是如何将数据传播到数据湖中。在这里 德贝兹服务器冰山 项目的到来:基于Debezum和阿帕奇冰山,它可以让您处理来自源数据库的实时数据更改事件,并将它们上传到冰山支持的任何对象存储。所以让我们仔细看看这两个项目。

脱贝唑 是一个用于更改数据捕获的开源分布式平台。Debezum从数据库的事务日志中提取更改的事件,并通过事件流平台将其传递给消费者,使用不同的格式,如JSON、阿帕奇阿沃罗、谷歌协议缓冲区等。在大多数情况下,德贝兹与阿帕奇卡夫卡和卡夫卡连接。但是,通过Debezum服务器,也是其他通讯基础设施的用户,比如"运动",google酒吧/子,脉冲星可以从Debezum的更改数据捕捉功能中获益。在这里你可以看到 支助目的地 .

阿帕奇冰山 是一个"大型分析数据集的开放表格式"。冰山使用高性能的表格格式,就像一个SQL表一样工作,为计算引擎添加了表格,包括SASS、TIINO、普雷斯托布、弗林克和蜂巢。"它支持酸插入以及行级删除和更新。它提供了一个JavaAPI来管理表元数据,如模式和分区规格,以及存储表数据的数据文件。

阿帕奇冰山有一个概念 数据和删除文件 .数据文件是冰山使用的文件后,现场保持实际数据.删除文件是用于编码现有数据文件中删除的行的不可变文件。这就是冰山删除/替换不可变数据文件中的单个行而不改写文件的方式。在德贝兹服务器冰山的情况下,这些是不可变的 阿帕奇地板 文件,一种被设计为"与CSV或TSV文件等基于行的数据相比,有效和有效的平面柱状存储格式"的格式。

阿帕奇冰山消费者

德贝司服务器提供一个SPI 安装新的接收器适配器 这是创造阿帕奇冰山消费者的延伸点。

图片来自官网原文

图1体系结构概述:德贝齐斯服务器和阿帕奇冰山

冰山消费者将疾病控制中心的变化事件转换为冰山数据文件,并使用冰山JavaAPI将其提交到目的地表。它将每个德贝兹源主题映射到一个目标冰山表。

当找不到给定的冰山目的地表时,使用者使用更改事件架构创建它。此外,事件模式用于将更改事件本身映射到一个等价的冰山记录。因为这个,debezium.format.value.schemas.enable 配置选项必须设置。一旦德贝兹变更事件记录到冰山记录中,则从数据中删除该模式。

在高层,更改事件处理如下。每批收到的活动:

事件按目标冰山表分组;每个组包含来自单一源表的更改事件列表,共享相同的数据架构

对于每个目的地,事件被转换为冰山记录

冰山记录被保存为冰山数据和删除文件(只有当使用者使用升级模式运行时才创建删除文件)

文件被提交到目的地的冰山表(即:上载至目的地储存库)

经过处理的更改事件,标记为经过处理的DEBeZ铵

下面是一个完整的例子配置,用于使用与冰山适配器:

debezium.sink.type=iceberg

run with append mode

debezium.sink.iceberg.upsert=false

debezium.sink.iceberg.upsert-keep-deletes=true

debezium.sink.iceberg.table-prefix=debeziumcdc_

debezium.sink.iceberg.table-namespace=debeziumevents

debezium.sink.iceberg.fs.defaultFS=s3a://S3_BUCKET);

debezium.sink.iceberg.warehouse=s3a://S3_BUCKET/iceberg_warehouse

debezium.sink.iceberg.type=hadoop

debezium.sink.iceberg.catalog-name=mycatalog

debezium.sink.iceberg.catalog-impl=org.apache.iceberg.hadoop.HadoopCatalog

enable event schemas

debezium.format.value.schemas.enable=true

debezium.format.value=json

complex nested data types are not supported, do event flattening. unwrap message!

debezium.transforms=unwrap

debezium.transforms.unwrap.type=io.debezium.transforms.ExtractNewRecordState

debezium.transforms.unwrap.add.fields=op,table,source.ts_ms,db

debezium.transforms.unwrap.delete.handling.mode=rewrite

debezium.transforms.unwrap.drop.tombstones=true

更新和追加模式

默认情况下,冰山消费者以更新模式运行(debezium.sink.iceberg.upsert 开始true)。这意味着在源表中更新行时,目标行将替换为新的更新版本。当一个行从源中删除时,它也从目标中删除。当使用"升级"模式时,目的地的数据与源数据保持相同。升级模式使用冰山等量删除功能,并创建删除文件使用的数据事件(从源表的主键派生)的键。为了避免重复数据,对每个批进行重复删除,只保留记录的最后一个版本。例如,在单个事件中,同一记录可能出现两次:一次是插入时,另一次是更新时。使用升级模式,记录的最后一个提取版本总是存储在冰山上。

请注意,当源表没有定义主键时,也没有其他可用的密钥信息(例如:一个唯一的键或一个定义在Debezum中的自定义消息键),使用者使用append 该表的模式(见下文)。

使用更新插入模式保存删除记录

对于某些用例,保留删除的记录作为软删除是有用的。通过设置debezium.sink.iceberg.upsert-keep-deletes 选择true .此设置将在目标冰山表中保留最新版本的删除记录。将其设置为错误将从目标表中删除删除的记录.

附加模式

这是最简单的操作模式,通过设置实现debezium.sink.iceberg.upsert 到false .当使用带有附加模式的Debezum服务器冰山时,所有接收到的记录都被附加到目标表中。不删除重复数据或删除记录。通过附加模式可以分析记录的整个变化历史。

也有可能消耗实时事件 数据压缩 然后用单独的压实作业。冰山支持压缩数据和元数据文件以提高性能。

优化批处理尺寸

Debez铵提取并实时传递数据库事件,这可能会导致冰山上表格的提交太频繁,生成太多的小文件。对于批处理来说,这并不是最好的,特别是当一个接近实时的数据源是足够的时候。为了避免这个问题,可以增加每个提交的批处理大小。

在启用MaxBatchSizeWait 模式,冰山消费者使用德贝司指标优化批处理规模。它周期性地检索Debezns的内部事件队列的当前大小,并等待直到它到达max.batch.size .在等待时间内,在内存中收集到(在Debezns的内部队列中)。这样,每个提交(处理的事件集)处理更多的记录和一致的批处理大小。最大等待和检查间隔通过debezium.sink.batch.batch-size-wait.max-wait-ms 和debezium.sink.batch.batch-size-wait.wait-interval-ms 财产。这些设置应该与德贝司的debezium.source.max.queue.size 和debezium.source.max.batch.size 财产。

以下是所有相关设置的一个例子:

debezium.sink.batch.batch-size-wait=MaxBatchSizeWait

debezium.sink.batch.batch-size-wait.max-wait-ms=60000

debezium.sink.batch.batch-size-wait.wait-interval-ms=10000

debezium.sink.batch.metrics.snapshot-mbean=debezium.postgres:type=connector-metrics,context=snapshot,server=testc

debezium.sink.batch.metrics.streaming-mbean=debezium.postgres:type=connector-metrics,context=streaming,server=testc

increase max.batch.size to receive large number of events per batch

debezium.source.max.batch.size=50000

debezium.source.max.queue.size=400000

创建额外数据湖层

此时,数据湖的原始层已经加载完毕,包括数据复制和近实时管道功能。在顶部构建管理层(有时称为分析层或数据仓库层)变得非常简单明了。在分析层,原始数据是为满足分析需求而准备的;通常原始数据是重组、清理、版本化(见下面示例)、聚合和业务逻辑可以应用。通过可伸缩的处理引擎使用SQL是进行这种数据转换的最常见方式。

例如,有人可以很容易地使用 火花SQL (或预先准备好的文件、文件、文件等) 逐渐变化的维度 ,最常用的数据仓库表类型:

MERGE INTO dwh.consumers t

USING (

-- new data to insert

SELECT customer_id, name, effective_date, to_date('9999-12-31', 'yyyy-MM-dd') as end_date

FROM debezium.consumers

UNION ALL

-- update exiting records. close end_date

SELECT t.customer_id, t.name, t.effective_date, s.effective_date as end_date

FROM debezium.consumers s

INNER JOIN dwh.consumers t on s.customer_id = t.customer_id AND t.current = true

 ) s
 ON s.customer_id = t.customer_id AND s.effective_date = t.effective_date
 -- close last records/versions.
 WHEN MATCHED
   THEN UPDATE SET t.current = false, t.end_date = s.end_date
 -- insert new versions and new data
 WHEN NOT MATCHED THEN
    INSERT(customer_id, name, current, effective_date, end_date)
    VALUES(s.customer_id, s.name, true, s.effective_date, s.end_date);

可能需要用新的数据定期更新额外的数据湖层。最简单的方法是使用SQL更新或删除语句。这些SQL操作也是 冰山支持 :

INSERT INTO prod.db.table SELECT ...;

DELETE FROM prod.db.table WHERE ts >= '2020-05-01 00:00:00' and ts < '2020-06-01 00:00:00';

DELETE FROM prod.db.orders AS t1 WHERE EXISTS (SELECT order_id FROM prod.db.returned_orders WHERE t1.order_id = order_id;

UPDATE prod.db.all_events

SET session_time = 0, ignored = true

WHERE session_time < (SELECT min(session_time) FROM prod.db.good_events));

总结和贡献

从德贝兹和阿帕奇冰山来看, 德贝兹服务器冰山 为您的数据湖设置一个低延迟的数据摄入管道非常简单。这个项目完全是开源的,使用的是阿帕奇2.0许可证。德贝兹服务器冰山仍然是一个年轻的项目,还有很多改进。请随意测试,给出反馈,打开功能请求或发送拉请求。你可以看到更多的例子,开始尝试冰山和火花 这个项目 .

相关推荐
远歌已逝5 分钟前
维护在线重做日志(二)
数据库·oracle
qq_433099401 小时前
Ubuntu20.04从零安装IsaacSim/IsaacLab
数据库
Dlwyz1 小时前
redis-击穿、穿透、雪崩
数据库·redis·缓存
zhixingheyi_tian3 小时前
Spark 之 Aggregate
大数据·分布式·spark
PersistJiao3 小时前
Spark 分布式计算中网络传输和序列化的关系(一)
大数据·网络·spark
工业甲酰苯胺3 小时前
Redis性能优化的18招
数据库·redis·性能优化
没书读了4 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
i道i5 小时前
MySQL win安装 和 pymysql使用示例
数据库·mysql
小怪兽ysl5 小时前
【PostgreSQL使用pg_filedump工具解析数据文件以恢复数据】
数据库·postgresql
wqq_9922502775 小时前
springboot基于微信小程序的食堂预约点餐系统
数据库·微信小程序·小程序