数据湖|青训营笔记

95 阅读3分钟

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

发展历史

核心技术

文件结构

写入数据湖时:

  1. 按照每条数据的date进行分区
  2. 额外使用metadata文件记录表信息

Time travel

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

写入时新建一个json文件,以递增版本号命名,记录本次增删的文件; 每产生N个json时做一次聚合; 用checkpoint记录上次聚合的版本号

Transaction 事务

数据湖中的ACID,保证事务正确可靠

  • Atomicity:原子性,本次写入要么对用户可见,要么不可见(需要设计)
  • Consistency:一致性,输入是什么,落盘的就是什么(由计算引擎保证)
  • Isolation:事务隔离,正确解决读写冲突和写写冲突(需要设计)
  • Durability:持久性,落完数据后,即便服务器重启结果不变(由存储引擎保证)

Schema evolution

ID将Data与metadata的列一一对应

  1. 唯一确定的ID。新增列赋予新ID。删列ID不复用。
  2. 写入数据时,ID也写入数据文件
  3. 读取数据时,用ID做映射,如果:
    1. Data中没有,metadata中有: ADD
    2. Data中有,metadata中没有: DROP
    3. Data和metadata中都有同一ID ,但是name不同: RENAME
    4. 如果都有同一列名,而ID不同?

常见产品

IceBerg

元数据采集

通过Well-designed Metadata Layer,不同分组的data files信息被记录到不同的manifest file中,不同的snapshot对应一系列不同的manifest list

有助于filter的数据进行层层记录:

  1. manifest file记录了每个data file的分区范围
  2. manifest list记录了每个manifest file分区范围,分区可以快速定位,做manifest list级别裁剪
  3. manifest file记录了每个data file每列的最大值最小值

Hidden Partition

  • 传统分区:数据包含date列,则按date分区;要按hour分区则要增加hour列
  • Iceberg:包含timestamp列,可通过设置进行分区转换

Hudi

Hadoop Upsert Delete and Incremental

工作重点

  1. Timeline service : Hudi 管理transaction的方式
  2. Hudi Table Type : Copy on Write / Merge on Read
  3. 高效的Upserts: update or insert
  4. 索引表:快速定位一条数据的位置
  5. 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功能完善性
  • 引擎侧和社区的支持
  • 版本管理,鲁棒性