这是我参与「第四届青训营 」笔记创作活动的第10天
1. 发展历史
1.1. 数据湖发展阶段 - Hadoop
1.2. 数据湖发展阶段 - Hive
1.3. 数据湖发展阶段 - 湖仓一体、
1.4. 业界三大数据湖
1.5. 关于“数据湖”
- 数据相关概念比较新,一直处在演进当中
- 一开始是HDFS,裸pb、txt日志等等,叫数据湖
- 后来出现了Iceberg、Hudi、Delta Lake了,数据湖概念就基本等于这些产品了
- 也更贴近于Lakehouse的概念
2. 核心技术
2.1. 文件结构
写入数据时
- 按照每条数据的date进行分区
- 额外使用metadata文件记录表信息
2.2. Time travel
要点:
- 每次写入都生成一个新的元数据文件,记录变更
- 分区数据在Update时,不要删除旧数据,保证新旧共存
- 元数据中存储的具体文件路径,而不仅仅是分区文件夹
- 每一次写入操作,创建一个新的json文件,以递增版本号命名,记录本次新增/删除的文件
- 每当产生N个json,做一次聚合,记录完整的分区文件信息
- 用checkpoint记录上次做聚合的版本号
2.3. Transaction
ACID,是指数据库在写入或更新资料的过程中,为保证事务是正确可靠的,所必须具备的四个特征
以A个B转账10元为例子:
- Atomicity:原子性——要么A-10 B+10,要么都不变
- Consistency:一致性——不可以A-0 B+5
- Isolation:事务隔离性——A和C同时转给B10元,B最终应该+20
- Durability:持久性——转账服务器重启,结果不变
2.3.1. 原子性
写入流程:
- 写入parquet数据文件
- 写入json文件
如何确保原子性?
- 用户只会读取以版本号数据命名的json文件,每次读取到最大的版本号作为数据集的现状
- 新的写入写完parquet后开始写json文件,使用hash值对json文件命名,如a2fs4hg8ee.json
- 直到json文件内容写入完毕,利用hdfs的renameIfAbsent能力将其替换为000006.json,到此位置commit完成,新的读取将会以000006.json作为最新版本
2.3.2. 事务隔离
Update写入流程:
- 从最新的版本中,获取需要Update的分区
- 乐观锁先把该写入的文件全落盘,然后进入写json阶段
- 分几种情况:
- 发现版本号和一开始没区别,直接写新的版本
- 发现版本号增加了,看看新增的这些版本有没有更新我要更新的分区
- 没有,直接写新的版本
- 有,两者都更新了同一分区,得重新update了
2.4. Schema Evolution
Add/Drop/Rename
重要:
- 用户并不直接读取parquet文件本身,而是通过数据湖接口读取,如
Dataset<Row> ds = simpleDataLake.read(mytable).option(data=2020-01-01)
- 数据湖内部会读取应该读的parquet,并schema上做进一步处理
3. 各有所长
3.1. Iceberg 工作重点
用户体验
- Schema evolution
- Partition evolution
- Hidden partition
- Time Travel
- Version Rollback
性能:
- 快速的file plan
- 更多的filter方式
可靠性:
- ACID transaction
完全开源,由Apache孵化开发
3.1.1. Well-designed Metadata Layer
3.1.2. Data File Filter
3.1.3. Hidden Partition
3.2. Hudi
Hadoop Upsert Delete and Incremental
Hudi工作重点:
- Timeline service:Hudi管理transaction的方式
- Hudi Table Type:Copy on Write / Merge on Read
- 高效的Upserts:update or insert
- 索引表:快速定位一条数据的位置
- Streaming Ingestion Service
- 完全开源,由Apache孵化
3.2.1. Timeline service & Upsert & Incremental
3.2.2. Copy on Write
3.2.3. Merge on Read
3.3. Delta Lake 工作重点
- ACID Transaction
- Schema 校验(不是evolution)
- 流批一体
- Time Travel
- Upsert / Delete
- Z-Order 优化
- 只开源了一部分,由Databricks自己主导开发,Z-order等优化的实现未开源