数据湖 | 青训营笔记

60 阅读2分钟

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

  • 发展阶段:

    1. hadoop:HDFS适用目录来区分不同的数据集
    2. hive:对数据湖中的数据集进行定义
    3. 湖仓一体:结合数据湖和数据仓库的优势,将对于数据的严格管理实现到了分布式存储之上
  • 数据仓库:数据仓库将数据从数据源提取和转换,加载到目的地;数据仓库存储+计算不分离;数据仓库严格控制写入数据的schema

  • 关键特征:

    • Transcation(事务) ACID;Schema管理;存储计算分离;支持多种计算引擎和文件格式

Delta Lake

来源:databricks

工作重点:流批一体;Z-order优化

使用场景:Z-order等优化

Hudi

来源:滴滴,希望能够数据写入更低延迟

工作重点:高效的Upserts

  • timeline Service:记录的信息类似于metadata
  • Upsert :每一条样本都有一个主键pk,当upsert一条数据时,如果现有的数据中有就upate,无insert
  • Incremental:某个时间点后新增的数据
  • copy on Write:更新一个分区的时候,把原来的数据全部读出来做加工再写回去
  • merge on Write:对原始数据的更新值以pk为merge更新

使用场景:强需求Upserts

Iceberg

来源:Netflix,希望能够摆脱Hive架构带来的问题

Well-designed Metadata Layer:

  • files定义表结构
  • lists存储一个snapshot中所有mainfest的信息
  • manifests存储data files的信息,data diles就是具体的数据文件

使用场景:可扩展性强

核心技术

文件机构

写入数据湖的时候,按照每条数据的date进行分区,额外使用metadata文件记录表信息

Time travel:

  • 每次写入的时候等生成一个元数据文件,记录变更;

    • json文件以递增的版本号命名,记录本次新增/删除的文件
    • 每产生N个json做一次聚合,记录完整的分区文件信息
    • 用ckp记录聚合的版本号
  • 分区数据在update时,不要删除旧数据,保证新旧共存;

  • 元数据中存储具体的文件路径,而不仅仅是分区文件夹。

事务完整性

原子性:

每次都读区最大的版本号作为数据集的现状。新的写入使用hash值对json命名;知道json文件写入完成会rename,完成commit。下次读取以它为最新版本;

事务隔离:

从最新的版本中获取需要的update分区,先把该写入的文件全部罗盘,然后进入写json阶段。

版本进化

id将data和metadata的列名做一一对应

总结

  • 数据湖的相关概念比较新,一开始是HDFS,裸pd,txt日志等等。现在数据湖的概念约等于那三个产品
  • 可以根据使用需求选择不同产品