使用 Debezium 和 Apache Iceberg 创建数据湖


今天为数据分析、数据报告或机器学习构建数据湖已经是一种常见的做法。
在这篇博文中,我们将描述一种构建数据湖的简单方法。该解决方案使用基于 Debezium 的实时数据管道,支持 ACID 事务、SQL 更新并且具有高度可扩展性。并且不需要 Apache Kafka 或 Apache Spark 应用程序来构建数据馈送,从而降低了整体解决方案的复杂性。
让我们从数据湖概念的简短描述开始:数据湖:通常是数据的中央存储,包括源系统数据、传感器数据、社交数据等的原始副本。您可以按原样存储数据,而无需先处理数据,然后再运行不同类型的分析。
 
Apache IceBerg
由于操作数据通常驻留在关系数据库或 NoSQL 数据存储中,问题是如何将数据传播到数据湖中。这就是Debezium Server Iceberg项目的用武之地:基于 Debezium 和 Apache Iceberg,它允许您处理来自源数据库的实时数据更改事件,并将它们上传到 Iceberg 支持的任何对象存储。
那么让我们仔细看看这两个项目。

  • Debezium是一个用于更改数据捕获的开源分布式平台。Debezium 从数据库的事务日志中提取更改事件,并通过事件流平台使用不同的格式(例如 JSON、Apache Avro、Google Protocol Buffers 等)将它们交付给消费者。大多数时候,Debezium 与 A​​pache Kafka 和 Kafka Connect 一起使用。但是通过 Debezium Server,Kinesis、Google Pub/Sub 等其他消息传递基础设施的用户也可以从 Debezium 的变更数据捕获功能中受益。在这里您可以看到当前支持的目的地
  • Apache Iceberg是一种“用于大型分析数据集的开放表格式。Iceberg 使用高性能表格式向包括 Spark、Trino、PrestoDB、Flink 和 Hive 在内的计算引擎添加表,就像 SQL 表一样工作。” 它支持 ACID 插入以及行级删除和更新。它提供了一个 Java API 来管理表元数据,如模式和分区规范,以及存储表数据的数据文件。Apache Iceberg 有数据和删除文件的概念。数据文件是 Iceberg 在幕后用来保存实际数据的文件。删除文件是对在现有数据文件中删除的行进行编码的不可变文件。这就是 Iceberg 在不重写文件的情况下删除/替换不可变数据文件中的单个行的方式。在 Debezium Server Iceberg 的情况下,这些是不可变的Apache Parquet文件,这种格式被设计为“与 CSV 或 TSV 文件等基于行的文件相比,数据的高效且高性能的扁平列式存储格式”。
  • Debezium Server Iceberg基于 Debezium 和 Apache Iceberg,让为您的数据湖设置低延迟数据摄取管道变得非常简单。该项目完全开源,使用 Apache 2.0 许可。Debezium Server Iceberg 仍然是一个年轻的项目,还有很多地方需要改进。请随意测试、提供反馈、打开功能请求或发送拉取请求。您可以查看更多示例并使用此项目开始试验 Iceberg 和 Spark 。 

 
Apache Iceberg 消费者
Debezium Server 提供了一个 SPI 来实现新的接收器适配器,这是用于创建 Apache Iceberg 消费者的扩展点。

Iceberg 消费者将 CDC 更改事件转换为 Iceberg 数据文件,并使用 Iceberg Java API 将它们提交到目标表。它将每个 Debezium 源主题映射到目标 Iceberg 表。
当未找到给定的 Iceberg 目标表时,消费者使用更改事件模式创建它。此外,事件模式用于将更改事件本身映射到等效的Iceberg 记录。因此,debezium.format.value.schemas.enable必须设置配置选项。一旦 Debezium 更改事件被记录到 Iceberg 记录中,模式就会从数据中删除。
  • 默认情况下,Iceberg 消费者以 upsert 模式运行(debezium.sink.iceberg.upsert设置为true)。这意味着当源表中的一行被更新时,目标是用新的更新版本替换的行。当从源中删除一行时,它也会从目标中删除。使用 upsert 模式时,目标数据与源数据保持一致。upsert 模式使用 Iceberg 等式删除功能,并使用 Debezium 更改数据事件的键(从源表的主键派生)创建删除文件。为避免重复数据,对每个批次进行重复数据删除,并且只保留最后一个版本的记录。
  • Append 模式这是最直接的操作模式,通过设置debezium.sink.iceberg.upsert为启用false。使用带有附加模式的 Debezium Server Iceberg 时,所有接收到的记录都会附加到目标表中。不进行重复数据删除或记录删除。使用附加模式可以分析记录的整个更改历史记录。