数据湖三剑客:Delta Lake、Hudi 与 Iceberg 详解 | 青训营笔记

115 阅读3分钟

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

一、发展历史

数据湖三阶段:Hadoop、Hive、湖仓一体

Hadoop

HDFS-分布式存储系统: HDFS通过将文件分块来存储大文件,HDFS的组件有NameNode和 DataNode,分别负责提供元数 据和数据服务。在读/写数据时,HDFS客户端需要先从 NameNode 上获取数据读取/写入的 DataNode地址,然后和DataNode交互来完成数据读/写。

优点:

  • 可以实现分布式存储
  • 不同目录区分数据集,

缺点:

  • 不能做到多个人同时去修改HDFS里的数据
  • 无法知道HDFS里数据schema是什么样的

Hive

优点:

  • 相比于HDFS,可以知道HDFS里的数据格式schema是什么样的

缺点:

  • 建好表以后,不能对schema进行变更,比如删掉一列这种操作
  • 依然不能多人同时修改、读写

湖仓一体

  • 数仓将数据从数据源提取和转换,加载到目的地
  • 存算不分离
  • 严格管控 schema

结合优势:ACID(数仓)、schema 管理(数仓)、存算分离(数据湖)、多引擎和文件格式支持

二、核心技术

Time travel:

  • 每次写入新生成一个元数据文件,记录变更;
  • 分区数据在更新时,不删除旧数据,新旧共存
  • 元数据要存具体的文件路径
  • 每次写入创建一个 json,每N个 json 做一次聚合并记录分区信息,checkpoint 记录上次完成的聚合版本号
  • 可以定期删一些过久数据 image.png

Transaction:事务性,数据湖的 ACID

  • 原子性:写入要么可见要么不可见,先写入 parquet 文件,以 Hash.parquet 文件存储,写完后写 Hash.json,写完后尝试重命名为版本号.json,如果失败就无法 commit,新写入在没有 commit 前用户无法读取(用户只读当前 最大版本号.json)
  • 一致性:计算引擎保证
  • 事务隔离:读写和写写冲突,由于新写入不替换原数据,故读写冲突已解决。Update 时采用乐观锁,先全写文件,进入写 json,看版本号有无变化,若变化,查看新增版本是否更新我要更新的分区,没有则写新版本,有则重新 update。
  • 持久性:存储引擎保证

Schema Evolutio

  • 用户不直接读 parquet 文件,通过数据湖接口读取分区 parquet,数据湖读取时在 schema 上处理

  • ID 将 data 和 metadata 的列名一一对应,删除 ID 不会复用,写入数据时,ID 写入数据文件,读取时:

    • Data 没有 metadata 有:ADD
    • Data 有 metadata 无:DROP(读取时不读)
    • Data 有 metadata 有但名字不同:RENAME
    • 新增列赋予新ID,删除过的ID不再用
    • 将ID写入数据,用于判断数据版本
    • Data 是 parquet数据文件 —— 先写入
    • Metadata 是 Json 元数据文件 —— 后写入

三、三大数据湖的特点

Iceberg工作重点

用户体验

  • Schema evolution
  • Partion evolution
  • Hidden partition
  • Time Travel
  • Version Rollback

性能

  • 快速file plan
  • 更多的filter方式

可靠性

  • ACID Transaction

完全开源,由Apache孵化开发

Hudi

  • Timeline Serivce:记录的信息类似于metadata
  • Upsert:每一条样本都有一个主键PK,当Upsert-条数据时,如果现有的数据中有这个PK,则update这条数据。否则直接insert这条数据
  • Incremental:某个时间点后新增的数据

Delta Lake

  • ACID Transaction
  • Scheme校验
  • 流批一体
  • Time Travel
  • Upsert/Delete
  • Z-Order优化
  • 部分开源

三大数据湖支持场景

  • Iceberg 支持:ACID transactions、Partition Evolution、Schema Evolution、Time-Travel
  • Hudi 支持:ACID transactions、Schema Evolution(partial)、Time-Travel
  • Delta Lake 支持:ACID transactions、Schema Evolution(partial)、Time-Travel