数据湖表格式比较(Iceberg、Hudi 和 Delta Lake)


表格格式是数据工具和语言与数据湖进行交互的方式,就像我们与数据库进行交互一样。表格格式允许我们将不同的数据文件抽象为一个单一的数据集,一个表格。

数据湖中的数据通常可以跨越多个文件。我们可以使用 Spark 和 Flink 等工具,使用 R、Python、Scala 和 Java 来设计和分析这些数据。能够将这些文件的组定义为单个数据集(例如表格),使分析它们变得更加容易(与手动分组文件或一次分析一个文件相比)。最重要的是,SQL 依赖于表的概念,而 SQL 可能是进行分析最容易使用的语言。

Hive是第一代表格式
最原始表格式是 Apache Hive。在 Hive 中,表被定义为一个或多个特定目录中的所有文件。虽然这使 SQL 表达式和其他分析能够在数据湖上运行,但它无法有效地扩展到满足当今需求所需的分析量和复杂性,所以现在开发了其他表格格式以提供所需的可伸缩性。

新一代表格式
Apache Iceberg、Apache Hudi 和 Databricks Delta Lake。这三者都采​​用了类似的方法来利用元数据来处理繁重的工作。元数据结构用于定义:

  • 什么是桌子?
  • 表的架构是什么?
  • 表是如何分区的?
  • 该表由哪些数据文件组成?

虽然从类似的前提开始,但每种格式都有许多差异,这可能会使一种表格格式在数据湖上启用分析时比另一种更具吸引力。
在本文中,我们将比较这三种格式的目标提供的功能、兼容的工具和社区贡献,以确保它们是长期投资的良好格式。

Iceberg、Hudi 和 Delta Lake三种下一代格式中的任何一种可能会取代传统Hive,成为在数据湖上表示表的行业标准。当您选择长期采用哪种格式时,请务必问自己以下问题:

  • 哪种格式具有我需要的最强大的功能版本?
  • 哪种格式使我能够使用 SQL 来利用其大部分功能,以便我的数据消费者可以访问它?
  • 哪种格式具有引擎支持和社区支持的势头?
  • 哪种格式可以让我访问最强大的版本控制工具?

本文将主要关注比较开源表格式,这些格式使您能够使用不同的引擎和工具在数据湖上使用开放架构运行分析,因此我们将重点关注 Delta Lake 的开源版本。开放式架构有助于最大限度地降低成本,避免供应商锁定,并确保始终可以使用最新和同类最佳的工具来处理您的数据。
请记住,Databricks 拥有自己的 Delta Lake 专有分支,该分支具有仅在 Databricks 平台上可用的功能。Spark 也是如此——Databricks 管理的 Spark 集群运行专有的 Spark 分支,其功能仅适用于 Databricks 客户。这些专有分支未开放以使其他引擎和工具能够充分利用它们,因此不是本文的重点。

Apache Iceberg
Apache Iceberg 的做法是通过三类元数据来定义表。这些类别是:

  • 定义表的“元数据文件”
  • 定义表快照的“清单列表”
  • “清单”定义了可能是一个或多个快照的一部分的数据文件组

查询优化和 Iceberg 的所有功能都是由这三层元数据中的数据实现的。
通过元数据树(即元数据文件、清单列表和清单),Iceberg 提供了快照隔离和 ACID 支持。运行查询时,Iceberg 将使用最新的快照,除非另有说明。对任何给定表的写入会创建一个新快照,这不会影响并发查询。并发写入通过乐观并发处理(谁先写新快照,谁先写,然后再尝试其他写)。
除了典型的创建、插入和合并之外,Apache Iceberg 还可以进行行级更新和删除。所有这些事务都可以使用SQL 命令进行。

Apache Iceberg 是目前唯一支持分区演化的表格式。根据分区列和列上的转换(如将时间戳转换为一天或一年)来跟踪分区。 
分区允许更有效的查询,而不是每次都扫描表的完整深度。当您有效地组织要查询的数据时,分区是一个重要的概念。通常,表的分区方案需要随着时间而改变。使用 Hive,更改分区方案是一项非常繁重的操作。如果数据按年分区并且我们想将其更改为按月分区,则需要重写整个表。大规模管理数据需要更有效的分区。 
分区演化允许我们更新表的分区方案,而无需重写所有以前的数据。

每次对 Iceberg 表进行更新时,都会创建一个快照。您可以指定快照 ID 或时间戳,并像使用 Apache Iceberg 一样查询数据。要维护 Apache Iceberg 表,您需要使用 expireSnapshots 过程定期使快照过期以减少存储的文件数量(例如,您可能希望使所有早于当年的快照过期。)。快照过期后,您将无法穿越回它。

Apache Hudi
Apache Hudi 的方法是将所有事务分组为沿时间线发生的不同类型的操作。Hudi 使用基于目录的方法来处理带有时间戳的文件和跟踪该数据文件中记录更改的日志文件。Hudi 允许您选择启用元数据表以进行查询优化(元数据表现在默认开启,从 0.11.0 版本开始)。该表将跟踪可用于查询计划而不是文件操作的文件列表,从而避免大型数据集的潜在瓶颈。

Apache Hudi 还为CREATE TABLEINSERTUPDATEDELETEQueries提供原子事务和 SQL 支持

Hudi 表格格式围绕表格时间线展开,使您能够沿时间线查询以前的点。要维护 Hudi 表,请使用Hoodie Cleaner应用程序。一旦你清理了提交,你将不再能够对它们进行时间旅行。


Delta Lake
Delta Lake 的方法是跟踪两种文件中的元数据: 

  1. 增量日志按顺序跟踪表的更改。 
  2. 检查点汇总了到该点为止对表的所有更改减去相互取消的事务。

Delta Lake 还支持 ACID 事务,并包括 对创建、插入、合并、更新和删除的 SQL 支持。 

每个 Delta 文件都代表表相对于前一个 Delta 文件的更改,因此您可以针对特定的 Delta 文件或检查点来查询表的早期状态。默认情况下,Delta Lake 在表的可调整数据保留设置中保留最近 30 天的历史记录。使用 Vacuum 实用程序从过期快照中清理数据文件。使用 Delta Lake,您无法在没有检查点可参考的情况下穿越到已删除日志文件的点。
根据清理的日志,您可以禁用对一组快照的时间旅行。例如,假设您有日志 1-30,并在日志 15 处创建了一个检查点。清理日志 1 将禁用到日志 1-14 的时间旅行,因为没有更早的检查点可以从中重建表。

详细点击标题