这是我参与「第四届青训营」笔记创作活动的第十三天。
发展历史
核心技术
文件结构
写入数据湖时:
- 按照每条数据的date进行分区
- 额外使用metadata文件记录表信息
Time travel
- 每次写入都生成一个新的元数据文件,记录变更
- 分区数据在Update时,不要删除旧数据,保证新旧共存
- 元数据中存储具体的文件路径,而不仅仅是分区文件夹
写入时新建一个json文件,以递增版本号命名,记录本次增删的文件; 每产生N个json时做一次聚合; 用checkpoint记录上次聚合的版本号
Transaction 事务
数据湖中的ACID,保证事务正确可靠
- Atomicity:原子性,本次写入要么对用户可见,要么不可见(需要设计)
- Consistency:一致性,输入是什么,落盘的就是什么(由计算引擎保证)
- Isolation:事务隔离,正确解决读写冲突和写写冲突(需要设计)
- Durability:持久性,落完数据后,即便服务器重启结果不变(由存储引擎保证)
Schema evolution
ID将Data与metadata的列一一对应
- 唯一确定的ID。新增列赋予新ID。删列ID不复用。
- 写入数据时,ID也写入数据文件
- 读取数据时,用ID做映射,如果:
- Data中没有,metadata中有: ADD
- Data中有,metadata中没有: DROP
- Data和metadata中都有同一ID ,但是name不同: RENAME
- 如果都有同一列名,而ID不同?
常见产品
IceBerg
元数据采集
通过Well-designed Metadata Layer,不同分组的data files信息被记录到不同的manifest file中,不同的snapshot对应一系列不同的manifest list
有助于filter的数据进行层层记录:
- manifest file记录了每个data file的分区范围
- manifest list记录了每个manifest file分区范围,分区可以快速定位,做manifest list级别裁剪
- manifest file记录了每个data file每列的最大值最小值
Hidden Partition
- 传统分区:数据包含date列,则按date分区;要按hour分区则要增加hour列
- Iceberg:包含timestamp列,可通过设置进行分区转换
Hudi
Hadoop Upsert Delete and Incremental
工作重点
- Timeline service : Hudi 管理transaction的方式
- Hudi Table Type : Copy on Write / Merge on Read
- 高效的Upserts: update or insert
- 索引表:快速定位一条数据的位置
- Streaming Ingestion Service
- timeline service:记录的数据与metadata相似
- upsert:每条样本有主键PK,upsert时,若存在PK则update,否则insert
- incremental:某时间点后新增的数据
merge on read:将对同一PK的操作结果存储到小文件,读取时进行join
Delta Lake
流批一体
Z-Order优化
选型
短期
- upsert-->Hudi
- 可扩展性-->Iceberg
- Z-Order-->Delta Lake
长期
- feature稳定性
- SQL功能完善性
- 引擎侧和社区的支持
- 版本管理,鲁棒性