数据湖三剑客 详解 | 青训营笔记

435 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第12天。

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

Delta Lake、Hudi 与 Iceberg:

共同点

三者均为Data Lake的数据存储中间层,其数据管理的功能均是基于一系列的meta文件。

meta 文件:类似于数据库的 catalog/wal,起到 schema 管理、事务管理和数据管理的功能。

Meta 文件包含有表的 schema 信息。因此系统可以自己掌握 Schema 的变动,提供 Schema 演化的支持。在文件系统提供原子性和一致性的支持下,Meta 文件也有 transaction log 的功能。所有对表的变更都会生成一份新的 meta 文件,于是系统就有了 ACID 和多版本的支持,同时可以提供访问历史的功能。

不同点

关于Hudi

在查询方面,Hudi 支持 Hive、Spark、Presto。

在性能方面,Hudi 设计了 HoodieKey,一个类似于主键的东西。HoodieKey有 Min/Max 统计,BloomFilter,用于快速定位 Record 所在的文件。

Hudi 的另一大特色是支持 Copy On Write 和 Merge On Read。 Copy On Write在写入时做数据的 merge,虽然写入性能略差,但是读性能更高一些。Merge On Read在读的时候做 merge,读性能差一点点,但是写入数据会比较及时,因而Merge On Read可以提供近实时的数据分析能力。

关于Iceberg

Iceberg 没有类似的  HoodieKey  设计,其不强调主键。没有主键,则做 update、delete、merge 等操作就要通过 Join 来实现,然而Join 需要有一个 类似 SQL 的执行引擎。

Iceberg 在查询性能方面最值得一提的是它的 hidden partition 功能。Hidden partition 是对于用户输入的数据,用户可以选取其中某些列做适当的变换形成一个新的列作为 partition 列。这个 partition 列仅仅为了将数据进行分区,并不直接体现在表的 schema 中。

Iceberg 还提供了建表的 API,用户可以使用该 API 指定表名、schema、partition 信息等,然后在 Hive catalog 中完成建表。

关于Delta

Delta 是流批一体的 Data Lake 存储层,不强调主键,支持基于Join来实现 update、delete、merge等操作。Delta来源于Databricks,spark 的所有数据写入方式,包括基于 dataframe 的批式、流式,以及 SQL 的 Insert、Insert Overwrite 等都是支持的。

Delta 在数据 merge 方面性能不如 Hudi,在查询方面性能不如 Iceberg。但是Delta 的一大优点就是与 Spark 的整合能力,尤其是其流批一体的设计。

Delta 号称是 Lambda 架构、Kappa 架构的改进版,无需关心流批,无需关心架构。这一点上 Hudi 和 Iceberg 是远远不及的。