Apache Iceberg 是一种现代表格式,旨在克服传统 Hive 表的局限性,提供更高的性能、一致性和可扩展性。在本文中,我们将探讨 Iceberg 的演变、其关键功能(如 ACID 事务、分区演变和时间旅行)以及它如何与现代数据湖集成。我们还将深入探讨其架构、元数据管理和目录系统,并将其与其他表格式(如 Delta Lake 和 Parquet)进行比较。最后,您将清楚地了解 Apache Iceberg 如何增强大规模数据管理和分析。
学习目标
- 了解 Apache Iceberg 的主要功能和架构。
- 了解 Iceberg 如何在不重写数据的情况下实现模式和分区的演进。
- 探索 ACID 事务和时间旅行如何提高数据一致性。
- 比较 Iceberg 与其他表格式(如 Delta Lake 和 Hudi)。
- 探索 Apache Iceberg 提高数据湖性能的用例。
Apache Iceberg简介
Apache Iceberg 是由 Netflix 的 Ryan Blue 和 Daniel Weeks 于 2017 年开发的一种表格式,旨在解决与 Hive 表格式相关的性能瓶颈、一致性问题和局限性。2018 年,该项目开源并捐赠给 Apache 软件基金会,吸引了苹果、Dremio、AWS、腾讯、LinkedIn 和 Stripe 等大公司的贡献。随着时间的推移,更多的组织也加入了支持和增强该项目的行列。
Source: Apache Iceberg: The Definitive Guide
Apache Iceberg的演变
Netflix 发现了 Hive 表格式中的一个基本缺陷:表使用目录和子目录进行跟踪,这限制了保持一致性、提高并发性和支持数据仓库中常见功能所需的粒度水平。为了克服这些限制,Netflix 开始开发一种新的表格格式,并确定了几个关键目标:
一致性
当更新跨越多个分区时,用户绝不会遇到数据不一致的情况。更改应原子式快速应用,确保用户在更新前或更新后都能看到数据,但绝不会处于中间状态。
性能
Hive 对文件和目录列表的依赖造成了查询规划瓶颈。新格式需要提供高效的元数据处理,减少不必要的文件扫描,提高查询执行速度。
易用性
用户无需了解表的物理结构,就能从分区中获益。系统应自动优化查询,而无需对派生分区列进行额外过滤。
可发展性
Hive 中的模式修改经常会导致不安全的事务,而更改表的分区则需要重写整个数据集。新格式必须允许安全的模式和分区更新,而不需要重写整个表。
可扩展性
所有这些改进都必须在 Netflix 的庞大规模上运行,高效处理 PB 级的数据。
Iceberg格式介绍
为了应对这些挑战,Netflix 设计了 Iceberg,以文件而不是目录的规范列表来跟踪表。Apache Iceberg 是一种标准化的表格格式,它定义了元数据在多个文件中的结构。为了推动采用,该项目提供了与 Apache Spark 和 Apache Flink 等流行计算引擎集成的库。
Data Lakes的标准
Apache Iceberg 可与现有的存储解决方案和计算引擎无缝集成,使工具无需进行重大改动即可采用该标准。我们的目标是让 Iceberg 成为无处不在的行业标准,使用户能够与表格进行交互,而不必担心底层格式。
现在,许多数据工具都提供对 Iceberg 的本地支持,使用户在不知不觉中就能使用 Iceberg 表格。随着时间的推移,随着自动表优化和摄取工具的发展,即使是数据工程师也能像使用传统数据仓库一样轻松地与数据湖存储交互,而无需手动管理存储层。
Apache Iceberg的主要功能
Apache Iceberg 不仅仅是为了解决 Hive 表格式的局限性,它还引入了强大的功能,以增强数据湖和数据湖居工作负载。以下是其主要功能概述:
ACID事务
Apache Iceberg 使用乐观并发控制提供 ACID 保证,确保事务要么完全提交,要么完全回滚。与可能造成瓶颈的传统悲观锁定不同,Iceberg 的方法在保持一致性的同时最大限度地减少冲突。目录在管理这些事务中起着至关重要的作用,可防止可能导致数据丢失的冲突更新。
分区演变
传统数据湖的挑战之一是无法在不重写整个表的情况下修改分区。Iceberg 通过启用分区演进解决了这一问题,允许更改分区方案,而不需要昂贵的表重写。新数据可使用更新的分区策略写入,而旧数据保持不变,确保无缝优化。
Source: Apache Iceberg: The Definitive Guide
隐藏分区
用户通常不需要知道表是如何物理分区的。Iceberg 引入了一种更直观的方法,允许查询自动受益于分区。Iceberg 不要求用户通过派生的分区列进行过滤(例如,查询时间戳时通过 event_day 进行过滤),而是应用诸如 bucket、截断、年、月、日和小时等转换,确保无需人工干预即可高效执行查询。
Source: Apache Iceberg: The Definitive Guide
行级表操作
Iceberg 支持两种行级更新策略:
- 写入时复制(COW):当更新一行时,整个数据文件将被重写,以确保较强的一致性。
- 读取时合并(MOR):只有修改过的记录才会写入新文件,并且在查询执行过程中对更改进行调节,从而优化了频繁更新和删除的工作负载。
时间旅行
Iceberg 维护不可变的数据快照,实现时间旅行查询。该功能允许用户分析历史表状态,使其在审计、重现机器学习模型输出或检索特定时间点出现的数据时非常有用,而无需单独的数据副本。
Source: Apache Iceberg: The Definitive Guide
版本回滚
除了查询历史数据,Iceberg 还允许将表回滚到之前的快照。这对于撤销意外修改或将数据恢复到已知良好状态特别有用。
Source: Apache Iceberg: The Definitive Guide
模式演变
随着时间的推移,表自然会发生演变,需要添加或删除列、重命名字段或修改数据类型等更改。Iceberg 支持模式演进,无需重写表,确保灵活性的同时保持与现有数据的兼容性。
凭借这些功能,Apache Iceberg 正在通过提供强大、可扩展和用户友好的表管理功能,塑造数据湖的未来。
Apache Iceberg的架构
在本节中,我们将讨论 Apache Iceberg 的架构,以及 Apache Iceberg 如何解决 Hive 表格式中固有的问题。我们将能够了解到引擎盖下的最佳架构。
Source: Apache Iceberg: The Definitive Guide
数据层
Apache Iceberg 表的数据层负责存储实际的表数据。它主要由数据文件组成,但也包括标记为删除的记录的删除文件。这一层对于提供查询结果至关重要,因为它提供了处理所需的底层数据。虽然某些查询只需使用元数据就能回答,例如检索列的最大值,但数据层通常参与完成大多数用户查询。从结构上看,该层中的文件构成了 Apache Iceberg 树状架构的叶子。
在实际应用中,数据层托管在分布式文件系统(如 Hadoop 分布式文件系统(HDFS))或对象存储系统(如亚马逊 S3、Azure 数据湖存储(ADLS)或谷歌云存储(GCS))上。这种灵活性使 Apache Iceberg 能够与现代数据湖架构无缝集成,从而实现大规模高效数据管理和分析。
数据文件
数据文件存储 Apache Iceberg 表中的实际数据。Iceberg 与文件格式无关,支持 Apache Parquet、ORC 和 Avro,这提供了关键优势:
- 企业可根据历史或操作需要维护多种文件格式。
- 工作负载可以使用最合适的格式(例如,Apache Parquet、ORC 和 Avro)、
- 面向未来,随着技术的发展,可轻松采用新格式。
Source: Apache Iceberg: The Definitive Guide
尽管有这样的灵活性,Parquet 仍然是使用最广泛的格式,因为它的列式存储可以优化现代分析引擎的查询性能、压缩和并行性。
删除文件
由于数据湖存储是不可变的,因此不可能直接更新行。相反,删除文件可以跟踪删除的记录,从而实现读取时合并(MOR)更新。有两种类型:
位置删除:根据文件路径和行位置识别记录(例如,删除文件中第 234 行的记录)。
Source: Apache Iceberg: The Definitive Guide
等价删除:根据特定列值识别记录(例如,删除 order_id = 1234 的所有记录)。
Source: Apache Iceberg: The Definitive Guide
删除文件仅适用于 Iceberg v2 表,确保查询引擎使用序列号正确应用更新,防止在插入新数据时意外删除行。
Apache Iceberg中的元数据层
元数据层是 Iceberg 表架构的重要组成部分,负责管理所有元数据文件。它采用树形结构,既跟踪数据文件,也跟踪创建这些文件的操作。
Iceberg中的关键元数据组件
- Manifest Files
- 跟踪数据文件,并在细粒度级别删除文件。
- 包含列值范围等统计信息,有助于查询剪枝。
- 以Avro格式编写,存储效率高。
- Manifest Lists
- 代表特定时间的表快照。
- 存储清单文件的元数据,包括分区详情和行数。
- 帮助 Iceberg 维护时间旅行功能,以查询历史状态。
- Metadata Files
- 跟踪全表信息,如模式、分区规格和快照。
- 确保原子更新,防止并发写入时出现不一致。
- 维护历史更改日志,以支持模式演进。
- Puffin Files
- 存储高级统计数据和索引,如 Apache DataSketches 的 Theta sketches。
- 优化需要近似不同计数的查询(如每个地区的唯一用户)。
- 提高分析查询的性能,而无需全表扫描。
通过有效组织这些元数据文件,Iceberg 实现了时间旅行(查询历史数据状态)和模式演进(修改表模式而不中断现有查询)等关键功能。这种结构化方法使 Iceberg 成为管理大规模数据集的强大解决方案。
Apache Iceberg中的目录
当读取一个表或管理成百上千个表时,用户需要一种方法来找到正确的元数据文件,告诉他们在哪里读取或写入数据。Iceberg 目录就是这样一个中央注册表,帮助用户和系统确定任何给定表的当前元数据文件位置。
Iceberg目录的作用
目录的主要功能是为每个表存储一个指向当前元数据文件的指针。这个元数据指针至关重要,因为它能确保所有读写器在任何给定时间都与相同的表状态交互。目录主要为每个表存储一个指向当前元数据文件的指针。这个元数据指针可确保所有读写器在任何给定时间内与相同的表状态交互。
Iceberg目录如何存储元数据指针?
不同的后端系统都可以作为 Iceberg 目录,各自以自己的方式处理元数据指针:
- Hadoop 目录(亚马逊 S3 示例)
- 在表的元数据文件夹中使用名为 version-hint.text 的文件。
- 该文件包含最新元数据文件的版本号。
- 由于这种方法依赖于分布式文件系统(或类似的抽象),因此被称为Hadoop 目录。
- Hive Metastore 目录
- 在名为 location 的表属性中存储元数据文件位置。
- 常用于基于 Hive 的数据生态系统。
- Nessie 目录
- 在名为 metadataLocation 的表属性中存储元数据文件位置。
- 适用于版本控制的数据湖实施。
- AWS Glue 目录
- 功能与 Hive 元存储类似,但完全由 AWS 管理。
Apache Iceberg与其他表格式的比较
在数据湖中处理大规模数据时,选择正确的文件或表格式对性能、一致性和可扩展性至关重要。Apache Iceberg、Apache Parquet、Apache ORC 和 Delta Lake 被广泛使用,但它们的用途各不相同。
每种格式概述
格式 | 类型 | 关键特征 | 最佳用例 |
Apache Iceberg | 表格式 | ACID 事务、时间旅行、模式演进 | 大规模分析、基于云的数据湖 |
Apache Parquet | 文件格式 | 列式存储、压缩 | 优化查询、分析 |
Apache ORC | 文件格式 | 列式存储、轻量级索引 | 基于蜂巢的工作负载、大数据处 |
Delta Lake | 表格式 | ACID 事务、版本管理 | 流式+批处理工作负载、实时管道 |
Apache Iceberg 作为一种现代表格式,可实现大规模数据湖的 ACID 事务、模式演进、分区演进和时间旅行。与 Parquet 和 ORC 相比,Iceberg 不仅仅是一种文件格式,它还提供事务保证和元数据优化。虽然 Delta Lake 也支持 ACID 事务,但 Iceberg 在模式和分区演化方面更具优势,是长期云原生数据湖存储的有力选择。
另请阅读:Apache Arrow 入门
小结
Apache Iceberg 是一种功能强大的表格式,旨在克服 Hive 表格式的局限性,提供更好的一致性、性能、可扩展性和易用性。其创新功能,如 ACID 事务、分区演化、时间旅行和模式演化,使其成为管理大规模数据湖的企业的不二之选。通过与现有存储解决方案和计算引擎的无缝集成,Iceberg 为数据湖管理提供了一种灵活且面向未来的方法。
常见问题
Q1. 什么是 Apache Iceberg?
A. Apache Iceberg 作为一种开源表格式,可提高数据湖的性能、一致性和可扩展性。
Q2. Apache Iceberg 的需求是什么?
A. 开发人员创建了 Apache Iceberg,以克服 Hive 表格式的局限性,例如低效的元数据处理和缺乏原子事务。
Q3. Apache Iceberg 如何处理模式演化?
A. Iceberg 支持模式变更,如添加、重命名或删除列,而无需重写整个表。
Q4. Apache Iceberg 中的分区演化是什么?
A. 分区演进允许修改分区方案,而无需重写历史数据,从而实现更好的查询优化。
Q5. Iceberg 如何支持 ACID 事务?
A. 它使用乐观并发控制来确保原子更新并防止并发写入中的冲突。
评论留言