Apache Iceberg 是一种适用于海量分析表的高性能开源格式,有助于将 SQL 表用于大数据,并将这些表与 Apache Spark、Trino、Flink、Presto、Hive 和 Impala 等引擎安全集成。
除了开放表格式规范外,Iceberg 还包括一组 API 和库,使存储引擎、查询引擎和执行引擎能够顺利地与遵循该格式的表进行交互。
Iceberg 表格式已成为大数据生态系统不可或缺的一部分,这在很大程度上是因为它能够提供其他表格式通常不具备的功能。使用每个表上保留的大量元数据,Iceberg 允许架构演变、分区演变和表版本回滚,而无需昂贵的表重写或表迁移。它与存储系统完全无关,支持多个数据源,并且无文件系统依赖性。
Iceberg 最初由 Netflix 和 Apple 的数据工程师于 2017 年创建,用以消除 Apache Hive 的缺点,于次年实现开源并捐赠给 Apache 软件基金会。它在 2020 年成为 Apache 顶级项目。
Apache Iceberg 的速度、效率、可靠性和整体用户友好性有助于简化和协调任何规模的数据处理。这些优势使其成为许多领先的数据仓库、数据湖和湖仓一体的首选表格格式,包括 IBM® watsonx.data。Netezza 和 Db2 Warehouse。
Iceberg 是少数支持 ACID 事务的开源表格式之一:通过保证原子性、一致性、隔离性和持久性,数据交换可保持其准确性。
Iceberg 的起源是为了解决 Apache Hive 表在大型数据湖环境中的实际局限性。根据 Apache Iceberg 项目 PMC 主席、Netflix(前)高级工程师 Ryan Blue 的说法,“许多不同的服务和引擎都在使用 Hive 表。但问题是,我们无法保证正确性。我们没有原子交易。”他在 2021 年的一次会议上说道,“有时,一个系统的更改会导致另一个系统获得错误的数据,为了安全起见,这种问题导致我们从不使用这些服务,也不对我们的表格进行更改。”1
Apache Hive 本身最初作为一种使 Apache Hadoop 集群的运行类似于 SQL 可访问的关系数据库的手段。虽然它对静态数据非常有效,但很难适应不断变化的数据集:必须在不同的应用程序和用户之间手动协调变化,否则将面临大型数据集损坏和不准确的风险。
为了保证动态环境中的准确性,Iceberg 旨在确保任何数据事务都表现出所有四个 ACID 属性:
对数据的所有更改都像单个操作一样执行 - 也就是说,要么执行所有更改,要么不执行任何更改。例如,在金融数据交易中,原子性可以确保从一个账户借出的任何款项都会相应地贷记到另一个账户。
交易前的整体数据状态与交易后的数据状态之间没有矛盾。继续以金融交易为例,一致性可确保两个账户之间存在的合并资金在交易后与交易前相同。
任何事务的中间状态对其他事务都是不可见的;并发事务(同时在同一组数据上运行的事务)被视为序列化事务。在此金融交易中,隔离可确保任何其他交易都可以在借记账户或贷记账户中看到转移的资金,但不能在两者中看到(也不会两者都看不到)。
交易成功后,即使系统发生故障,任何数据更改都将仍然存在。在我们的财务示例中,这意味着即使随后立即发生全系统断电,交易仍将保持完整。
Apache Iceberg 表格式经常与其他两种提供 ACID 事务的开源数据技术进行比较:Delta Lake,这是最初由 Databricks 创建的优化存储层,它通过基于文件的事务日志和可扩展元数据处理来扩展 Parquet 数据文件;以及 Apache Hudi(Hudi 是“Hadoop 增删改、删除和增量”的缩写),最初由 Uber 于 2016 年开发。
Synvert 在 2022 年进行的一项研究生成了随机数据,并将其以 JSON 格式存储在 AWS S3 存储桶中,用于对这三种技术进行基准测试。他们的测试最终表明,在所有测试指标上,Iceberg 的优化表格格式的性能均优于 Delta Lake 和 Apache Hudi。2
存储:Iceberg 表生成的文件大小明显小于 Delta Lake 或 Hudi 的文件,这为存储优化提供了重大优势。
插入操作:对于插入操作,Iceberg 的性能也最快,即运行时间最短。Iceberg 和 Delta Lake 都比 Hudi 快得多。
更新操作:对于更新操作,Iceberg 的速度比 Delta Lake 和 Hudi 要快得多。值得注意的是,与同类不同,Iceberg 的运行时间并没有随着记录总数的增加而显著增加:在本研究测试的最大工作负载(5 亿条记录)下,Iceberg 比 Delta Lake 快近 10 倍。
移除操作:同样,在移除操作方面,Iceberg 也比两种替代方案快数倍。
Iceberg 实施了元数据文件的三层层次结构,以确保不同文件格式和持续更改的表数据的正确性和协调性。
Iceberg 以 Java 和 Python 编写,也在 Scala API 上提供,支持各种大数据文件格式,包括 Apache Parquet、Apache Avro 和 Apache ORC。它以与文件格式和供应商无关的方式提供与传统数据库中 SQL 表的功能类似的功能,并允许多个引擎处理同一个数据集。
Iceberg 表的架构包括三层:Iceberg 目录、元数据层和数据层。
Iceberg 目录本身位于元数据层和数据层之上,就像冰山一角位于水面之上一样。它存储最新(或“当前”)元数据指针,将给定表的名称映射到其当前元数据文件的位置。除了内置目录外,Iceberg 还支持其他目录框架,如 Hive MetaStore 或 AWS Glue。
Iceberg 目录级别的操作是原子的,因为这对于确保正在进行的事务的正确性至关重要。
因此,查询引擎在 Iceberg 目录中开始任何 SELECT 查询,该目录为查询引擎尝试读取的表提供当前元数据文件的位置。
Iceberg 元数据层由元数据文件、清单列表和清单文件组成(按降序)。
元数据文件存储表的元数据,包括表的模式、分区信息、当前快照和以前状态的快照。从 Iceberg 目录中的表条目指向当前元数据文件后,查询引擎使用 [current-snapshot-id] 值在 [snapshots] 数组中找到其条目。从那里,它可以找到并打开表的清单列表。
清单列表只是一个清单文件及其中每个数据文件的重要信息(如位置、关联快照和所属分区)的列表。在这个阶段可以使用某些优化和过滤功能。
清单文件跟踪数据文件及其相关详细信息、元数据和统计数据。这带来了 Iceberg 表格式相对于 Hive 表格式的一个根本优势:它能够在文件级别跟踪数据。在此阶段,每个 [data-file] 对象的 [file-path] 值可用于查找和打开该文件。
数据层,顾名思义,位于元数据层之下,包含最终文件本身。
Apache Iceberg 提供许多有用的功能,助力改进和简化数据管理。
Iceberg 在深入了解分区和查询的所有细节。Iceberg 的隐藏分区功能为用户节省了在查询表时提供分区布局信息的工作。用户不需要自己维护分区列,甚至不需要了解物理表布局,就能获得准确的查询结果。
这不仅使 Iceberg 分区对于用户非常友好,它还允许分区布局随着时间的推移而改变,而不会破坏预先编写的查询。当分区规格发生变化时,表中的数据(及其元数据)不会受到影响。只有在演变后写入表中的新数据才会用新规范进行分区,而这些新数据的元数据会单独保存。
Iceberg 为模式演变提供原生支持。这允许用户修改表格模式,而无需进行复杂的数据迁移,从而大大简化了对不断发展的数据结构的适应。
Iceberg 允许用户通过不同时间点的 Iceberg 数据快照进行时间旅行。这对于各种用例都很有价值,包括审计、调试和合规性检查。
Iceberg 提供了许多有助于优化查询性能的索引功能(例如用于将小文件合并为大文件的压缩选项),以减少元数据开销,以及减少查询执行期间不必要的数据读取的 Bloom 过滤器。
设计数据战略,消除数据孤岛、降低复杂性并提高数据质量,以获得卓越的客户和员工体验。
watsonx.data 支持您通过开放、混合和已治理数据,利用您的所有数据(无论位于何处)来扩展分析和 AI。
通过 IBM® Consulting 发掘企业数据的价值,建立以洞察分析为导向的组织,实现业务优势。
1“Apache Iceberg:新兴数据服务生态系统的枢纽?”,Datanami,2021 年 2 月 8 日
2 “ACID 数据湖的冲突:比较湖仓一体格式”,synvert,GlobalLogic 旗下公司,2022 年 8 月 9 日