iceberg介绍

546 阅读5分钟

 数据湖之前的大数据架构

Lambda架构

xtV89z83EhmcCM2GqzhiurD0-Bc5dBDpWic7J1wYhUs.png Lamdb架构,离线处理与实时处理分为两条链路。两条链路处理数据导致数据不一致等问题才有了Kappa架构

Kappa架构

Sfx1YjM6UF9w9U-FNZeZqDNZqSSMFrAicA0HCGWCMBs.png

Kappa架构也有缺陷:

  1. Kafka无法支持海量数据存储。
  2. Kafka无法支持高效的OLAP,大多数业务希望能在DWD/DWS层支持及时查询。
  3. 无法复用目前已经非常成熟的基于离线数仓的数据血缘、数据质量管理体系。需要重新实现一套数据血缘,数据管理体系。
  4. Kafka不支持update/upsert,仅支持append。

Iceberg是什么

**Apache Iceberg 是一种用于大型分析数据集的开放表格式。**Iceberg 使用高性能表格式将表添加到计算引擎中,包括 Spark、Trino、PrestoDB、Flink、Hive 和 Impala,其工作方式类似于 SQL 表。

Iceberg非常轻量级,可以作为lib与Spark、Flink集成。

RDc-j_fcC2nCWOZyUDvTYH4VhkWlD20tWT7QaflIKf8.png

esAGBdFqdasnhfO52CqBnjtThcRmmj0e2OF8-rAxSiM.png

Iceberg特点

演化

表结构演化Schema evolution

Iceberg 支持以下架构演进更改:

  • 添加 – 将新列添加到表或嵌套结构中
  • 删除 – 从表或嵌套结构中删除现有列
  • 重命名 – 重命名嵌套结构中的现有列或字段
  • 更新 – 扩大列、结构字段、映射键、映射值或列表元素的类型
  • 重新排序 – 更改嵌套结构中列或字段的顺序

Iceberg 架构更新是元数据更改,因此无需重写数据文件即可执行更新。

Iceberg 保证**表结构演化更改是独立的,没有副作用,**无需重写数据文件:

  1. 添加的列从不从其他列读取现有值。
  2. 删除列或字段不会更改任何其他列中的值。
  3. 更新列或字段不会更改任何其他列中的值。
  4. 更改结构中列或字段的顺序不会更改与列或字段名称关联的值。

Iceberg 使用唯一 ID 来跟踪表中的每一列。添加列时,会为其分配一个新 ID,以便不会错误地使用现有数据。

分区演化Partition evolution

Iceberg 表分区可以在现有表中更新,因为查询不直接引用分区值。

当您变更分区规范时,使用早期规则写入的旧数据保持不变。新数据是使用新规则在新分区中写入的。每个分区版本的元数据都是单独保存的。因此,当您开始编写查询时,您将获得拆分计划。这是每个分区布局使用为该特定分区布局派生的筛选器,他们单独管理文件的位置。下面是一个人为示例的可视化表示:

Sw8LHawCDo8bO-k9QlA21uEMfL1XXKiWwmF77JjS50k.png

排序演化Sort order evolution

与分区演化类似,Iceberg 排序顺序也可以在现有表中更新。 当您改变排序顺序时,使用较早顺序写入的旧数据保持不变。 当排序成本过高时,引擎始终可以选择以最新的排序顺序写入数据。

隐藏分区

Iceberg 可以按年、月、日和小时粒度划分时间戳。它还可以使用level列的分类将同样值的行存储在一起并加快查询速度。也就只是说可以支持多列分区。

SELECT level, message FROM logs
WHERE event_time BETWEEN '2018-12-01 10:00:00' AND '2018-12-01 12:00:00'

Iceberg支持隐藏分区:

  • Iceberg 处理为表中的行生成分区值的繁琐且容易出错的任务。
  • Iceberg 避免了自动读取不必要的分区。使用者不需要知道表是如何分区的,也不需要为他们的查询添加额外的过滤器。
  • Iceberg 分区规则可以根据需要进行演变。

hive 中的分区

在 Hive 中,分区是显式的,显示为一列,因此表将有一个名为 .写入时,插入需要提供列的数据

INSERT INTO logs PARTITION (event_date)
  SELECT level, message, event_time, format_time(event_time, 'YYYY-MM-dd')
  FROM unstructured_log_source

同样,除了筛选器event_time之外,搜索表的查询还必须具有 event_date筛选器。

SELECT level, count(1) as count FROM logs
WHERE event_time BETWEEN '2018-12-01 10:00:00' AND '2018-12-01 12:00:00'
  AND event_date = '2018-12-01'

如果缺少event_date筛选器,Hive 将扫描表中的每个文件,因为它不知道该列event_time 是否与该列event_date相关。

Iceberg 通过获取列值event_time并选择性地转换它来生成分区值。Iceberg 负责转换为event_date,并跟踪关系。

由于 Iceberg 不需要用户维护的分区列,因此它可以隐藏分区。每次都会正确生成分区值,并且尽可能始终用于加快查询速度。生产者和消费者甚至看不到****event_date。

快照

Iceberg 表元数据维护一个快照日志,该日志表示应用于表的更改。 快照是 Iceberg 的基础,因为它们是读者隔离和时间旅行查询的基础。 为了控制元数据大小和存储成本,Iceberg 提供了快照生命周期管理流程,例如基于表快照保留属性删除未使用的快照和不再需要的数据文件的

W08aAG0GKTs8Oju6FcJ4dcw2c6KUKJXDfI3700dBK_8.png

more

Hive4.0 beta 集成iceberg。

Spark 是目前用于 Iceberg 运用功能最丰富的计算引擎。

数据湖三剑客:Delta Lake、Hudi 与 Iceberg 

zI-sWUZopJT4412PCUD44gtwRRFfTOrPKMJ6rsvvxI4.webp

k0X6QLoNmy7Y87JsYbCgfpe8phhse98N_VunNT3x_0U.webp

UkyHsfl4IFlAYkdAXaTvzGD92_XkY8ijN1B-DKxblr8.webp