这是我参与「第四届青训营 」笔记创作活动的第8天
主要介绍三个目前主流的数据湖:Iceberg、Hudi、Delta Lake。
3 各有所长
3.1 IceBerg工作重点
用户体验:
- Schema Evolution
- Partition Evolution
- Hidden Partition
- Time Travel
- Version Rollback
性能:
- 1.快速file plan
- 2.更多的filter方式
可靠性:
- ACID Transaction
3.1.1 Well-designed Metadata Layer
Metadata files: 定义了表结构,存储了snapshot信息,分区列信息等
Mainfest lists:存储了一个snapshot中所有的manifest的信息
Mainfests: 存储了一些data files的信息
Data files: 就是具体的数据文件
3.1.2 Data File Filter
一些有助于filter的数据被层层记录:
- Manifest file 记录了每个data file的分区范围
- Manifest list 记录了每个manifest file的分区范围,分区可以被快速定位,可以做manifest list级别裁剪
- Manifest file 记录了每个data file每一列的最大值和最小值,可以做data file级别的裁剪
3.1.3 Hidden Partition
传统的分区方式:
- 数据中包含了date列,则按照date分区;如果希望按照hour分区,则需要新增hour列
Iceberg的分区方式:
数据中包含timestamp列,设置好partition transform方式
- 设置为date时,iceberg自动转换为date分区
- 设置为hour时,iceberg自动转换为hour分区
- iceberg记录了这层转化关系,并且按需求进行partition evolution
3.2 Hudi
Hadoop Upsert Delete and Incremental(hudi)
工作重点:
- Timeline service:Hudi管理transaction的方式
- Hudi Table Type: Copy on Write/Merge on Read
- 高效的Upsert:update or insert
- 索引表:快速定位一条数据的位置
- Streaming Ingestion Service
- 完全开源,由Apache孵化
3.2.1 Timeline Service & Upsert & Incremental
Timeline Service: 记录的信息类似于metadata
Upsert: 每一条样本都有一个主键PK,当Upsert一条数据时,如果现有的数据中有这个PK,则update这条数据。否则直接insert这条数据
Incremental: 某个时间点后新增的数据
3.2.2 Copy on Write
每次新增的数据时,都会先复制一份原来的数据,再加上新增数据,形成新数据,原来的数据同时保留。
缺点:如果原数据有几万列,我们一次更新只更新几列,那么重复写的数量太多了,浪费性能。
3.2.3 Merge on Read
新增的数据存放在另一块数结构中,每次需要读取数据时,是先Merge合并data file + update file,然后再读。
大幅提升写的时候的性能
3.3 Detla Lake工作重点
- ACID Transaction
- Schema 校验
- 流批一体
- Time Travel
- Upsert/Delete
- Z-Order优化
- 该项目没有完全开源
3.3.1 流批一体
由于Detla Lake是由Databrick公司开源,他是Spark的母公司,因此Detla Lake对Spark的支持比较好。
Detla Lake 可以分开存储批数据和流数据。
4 总结场景
| Iceberg | hudi | Detla Lake | |
|---|---|---|---|
| ACID Transaction | Y | Y | Y |
| Partition Evolution | Y | N | N |
| Schema Evolution | Y | N | N |
| Time Travel | Y | Y | Y |
4.1 技术选型
短期来看,每个项目都有一些自己的优势:
- 如果强需求Upserts,选hudi
- 如果希望可扩展性强,选iceberg
- 如果希望用上Z-order,掏钱买Detla Lake
长期来看,数据湖终将取代Hive,成为HDFS上的表格式标准。
- 我需要的feature在哪个数据湖上最稳定
- 哪个数据湖能够用最简单的接入方式(SQL)用上完善的功能
- 哪个数据湖有计算引擎侧的支持和社区支持
- 哪个数据湖的版本管理做的最好,最鲁棒
4.2 总结
- 数据湖的最新发展状态是湖仓一体
- 数据湖以低成本提供ACID Transaction、Schema Evolution、Time travel等高级功能