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

109 阅读4分钟

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


0x00 数据湖发展历史

0.1 发展阶段1-Hadoop

11_数据湖发展阶段_Hadoop.png

  • 数据湖最开始的概念——分布式存储HDFS

  • 使用目录来区分不同的数据集

    • /douyin
      • /20220623
      • /20220624
    • /toutiao
  • 优点:

    • 同一公司/组织可以使用共享存储
    • 数据访问方便,灵活性高
  • 缺点:(数据沼泽)

    • 没有记录文件的schema(包括列名、列类型),经常使用Schema on Query的方式
    • 难以得知数据集包含了那些文件,是通过什么样的分区组织的
    • 如果多个程序都在修改这个数据集(修改数据、修改表结构)其他程序难以配合做修改

0.2 发展阶段2-Hive

11_发展阶段_Hive.jpeg

  • 数据湖的演进—Hive Metastore
  • 对数据湖中的数据集进行集中”定义”
    • 数据湖中存在了哪些数据集
    • 它们都存储在什么目录
    • 数据集的schema是什么样子的
    • 数据集有哪些分区,每个分区的目录是什么
  • 缺点:
    • 两个用户同时修改同一文件时数据出错
    • Hive允许我们仅在最后一列后方添加列

0.3 发展阶段3-湖仓一体

11_发展阶段_湖仓一体.png

  • 数据仓库将数据从数据源提取和转换,加载到目的地
  • 数据仓库存储+计算不分离
  • 数据仓库严格控制写入数据的schema

11_数据湖发展阶段.png 湖仓一体 结合了数据湖和数据仓库各自的优势,将数据仓库中对于数据的严格管理直接实现到了低成本的分布式存储之上。

11_数据湖发展阶段_湖仓一体2.png

0.4 业界三大数据湖

11_三大数据湖0.png

11_三大数据湖1.png

11_三大数据湖2.png

0x01 湖仓一体核心技术

1.1 文件结构

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

11_文件结构.png

1.2 Time travel

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

1.3 Transaction

数据湖中的ACID:

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

1.4 Schema Evolution

Add/Drop/Rename

  • 用户并不直接读取parquet文件本身,而是通过数据湖接口读取,如Dataset< Row>ds= simpleDataLake.read(mytable).option(date=2020-01-01)
  • 数据湖内部会读取应该读的parquet,并在schema上做进一步处理

0x02 湖仓一体项目对比

2.1 Iceberg

  • 用户体验
    1. Schema evolution
    2. Partition evolution
    3. Hidden partition
    4. Time Travel
    5. Version Rollback
  • 性能
    1. 快速file plan
    2. 更多的filter方式
  • 可靠性
    1. ACID Transaction

2.1.1 Well-designed Metadata Layer

  • Metadata files定义了表结构,存储snapshot信息,分区列信息等
  • Manifest lists存储了一个snapshot中所有manifest的信息
  • Manifests存储了一些data files的信息Data files就是具体的数据文件

11_Well-designed.png

2.1.2 Data File Filter

  1. Manifest file记录了每个data file的分区范围
  2. Manifest list记录了每个manifest file的分区范围,分区可以被快速定位。可以做manifest list级别裁剪。
  3. Manifest file记录了每个data file每一列的最大值,最小值可以通过其他的列(Userld)做data file级别裁剪。

2.1.3 Hidden Partition

Iceberg的分区方式:

  • 数据中包含timestamp列,设置partition transform方式
    • 设置为date时,iceberg帮你转化为date分区
    • 设置为hour时,iceberg帮你转化为hour分区
    • Iceberg记录了这层转化关系,并且按你的需要进行partition evolution

2.2 Hudi

Hudi工作重点:

  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
  6. 完全开源,由Apache孵化

2.2.1 Timeline Serivce Upsert Incremental

11_Hudi0.png

2.2.2 Copy On Write

11_Hudi1.png

2.2.3 Merge On Read

11_Hudi2.png

2.3 Delta DeltaLake

只开源了一部分,由Databricks自己主导开发,Z-order等优化的实现未开源

  1. ACID Transaction
  2. Schema校验(不是evolution)
  3. 流批一体
  4. Time Travel
  5. Upsert/Delete
  6. Z-Order优化

2.3.1 流批一体

11_流批一体0.png

11_流批一体1.png


0x03 总结场景

3.1 三个湖的异同

11_湖异同.png

3.2 三个湖的热度

11_湖热度.png

11_湖热度1.png