数据湖三剑客——Delta Lake、Hudi 与 Iceberg|青训营笔记

109 阅读3分钟

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

本次笔记重点内容

  1. 发展历史——数据湖三阶段
  2. 核心技术
  3. 不同的湖仓一体各有所长
  4. 应用

发展历史

  • 数据湖最开始的概念——Hadoop,HDFS

同一公司/组织可以使用共享存储,数据访问方便,灵活性高。但是需要有一定知识的人才能使用;难以得知数据集包含了哪些文件、如何组织;多个程序都在修改这个数据集,其他程序又难以配合进行修改。

  • 数据湖的演进——Hive

对数据湖中的数据集进行集中“定义”。但Hive表是静态表,读和写不同步,不同人读到的文件可能不同。

  • 湖仓一体阶段

什么是数据仓库?就是将数据从数据源提取和转换加载到目的地的仓库,存储计算不分离。数据湖存储成本低,数据仓库对于数据是严格管理的,两者结合。

业界三大数据湖

image.png

image.png

image.png

核心技术

Time travel

每次写入都生成一个新的元数据文件,记录变更;分区数据在更新时,不要删除旧数据,保证新旧共存;元数据中存储具体文件路径,不仅仅是分区文件夹。

Transaction——事务

ACID

数据库在写入或更新资料的过程中,为保证事务是准确可靠的所必备的四个特性:

ACID特性说明
原子性(Atomicity)要么A-10,要么B+10,要么都不变——本次写入要么对用户可见,要么不可见
一致性(Consistency)A减多少B就要加多少——输入是什么,落盘就是什么
隔离性(Isolation)A和C同时给B转10,B最终结果应该是+20——正确解读读写冲突和写写冲突
持久性(Durability)一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作
Schema Evolution

用一个ID将data和metadata的列名做一一对应。每一列赋予唯一确定的ID,删的列的ID不复用;写入数据时,ID也写入数据文件;读取数据时,用ID做映射——Data中有/没有,metadata中没有/有,说明是Drop/Add,若都有或都没有但是Name不同,说明Rename。

不同湖仓一体

Iceberg——快速file plan/更多的filter方式

Metadata Layer

image.png 右边metadata file中多的s1对应多的manifest file,多的manifest file对应多的data files。manifest list记录了每一个manifest file分区范围;manifest file记录了每一个data files分区范围和data file每一列的最大值最小值。

Hidden Partition

数据中包含timestamp列,设置好partition transform方式,设置为date/hour时,iceberg就帮忙转化到那个分区并记录这层转化方便以后按需求进行革新。

Hudi——高效Upserts(update/insert)/Timeline service/索引表(快速定位一条数据)

Copy on Write

image.png

更新时要把所有数据读出来,加工后再全部写回去

Merge On Read

image.png

把需要update的行读出来就好

Delta Lake——ACID Transaction/Schema校验/流批一体/Time Travel

image.png

总结场景

image.png

  • 短期看:强需求Upserts就选Hudi;希望可扩展性强就选Iceberg;希望用Z-Order(数据排布方式按Z字形走)优化就选企业版Delta
  • 长期看:注意我需要的feature在哪个数据湖上最稳定,哪一个数据湖能用最简单的接入方式(SQL)用上最完善的功能,哪一个数据湖有计算引擎和社区的支持