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许可证。德贝兹服务器冰山仍然是一个年轻的项目,还有很多改进。请随意测试,给出反馈,打开功能请求或发送拉请求。你可以看到更多的例子,开始尝试冰山和火花 这个项目 .

相关推荐
ACRELKY16 小时前
光伏运维迎来云端革命!AcrelCloud-1200如何破解分布式光伏四大痛点?
运维·分布式
阿里小阿希17 小时前
Vue3 + Element Plus 项目中日期时间处理的最佳实践与数据库设计规范
数据库·设计规范
白鹭18 小时前
MySQL源码部署(rhel7)
数据库·mysql
星期天要睡觉18 小时前
Linux 综合练习
linux·运维·服务器
666和77718 小时前
Struts2 工作总结
java·数据库
saynaihe18 小时前
proxmox8升级到proxmox9
linux·运维·服务器
还听珊瑚海吗18 小时前
SpringMVC(一)
数据库
Delphi菜鸟18 小时前
docker 部署RustDesk服务
运维·docker·容器
Orchestrator_me18 小时前
CentOS交换区处理
linux·运维·centos
FLS16818 小时前
VMwaer虚拟机安装完Centos后无法联网问题
linux·运维·centos