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

51 阅读3分钟

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

1. 发展历程

1.1 数据湖发展阶段---Hadoop

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

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

  • /douyin

    • /20220623
    • /20220624
  • /toutiao

好处:

  • 同一公司/组织可以使用共享存储
  • 数据访问方便,灵活性高

坏处:

1.没有记录文件的schema(包括列名、列类型),经常使用Schema on Query的方式

2.难以得知数据集包含了那些文件,是通过什么样的分区组织的

3.如果多个程序都在修改这个数据集(修改数据、修改表结构),其他程序难以配合做修改

会产生数据沼泽image.png

1.2 数据湖发展阶段---Hive

  • 数据湖的演进

  • Hive Metastore

    • 对数据湖中的数据集进行集中"定义'
    • 数据湖中存在了哪些数据集
    • 它们都存储在什么目录
    • 数据集的schema是什么样子的
    • 数据集有哪些分区,每个分区的目录是什么

image.png

如果这张hive表是静态的,没有新增写入,则所有读取方都能很便捷的使用

问题来了:

①假设Reader A和B都正在读取分区/20220623下的文件

此时Writer B:开始重写/20220623分区,一些文件被删了,一些文件增加了,一些文件还在修改中 Reader A和B读到的文件可能是不同的!

我们需要Transaction ACID

问题又来了:

分区/20220623下存储了schema为date|userId|phoneNumber的数据

需要注意:Hive allows us to add column after last column only

根据合规,我需要删掉phoneNumber,但是在Hive表上做不到。只好重写一张表(耗费资源)

我们需要支持更多样的schema变更!

1.3 数据湖发展阶段---湖仓一体阶段

  • 什么是数据仓库?

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

image.png

image.png

image.png

湖仓一体(数据湖的现状):

  • 结合了数据湖和数据仓库的优势

  • 将数据仓库中对于数据的严格管理直接实现到了低成本的分布式存储之上

  • Key Features

    • Transaction ACID
    • Schema管理
    • 存储计算分离
    • 支持多种计算引擎和文件格式

2. Iceberg工作重点

用户体验

1.Schema evolution

2.Partition evolution

3.Hidden partition

4.Time Travel

5.Version Rollback 性能

1.快速ifile plan

2.更多的filter方式

可靠性

1.ACID Transaction

完全开源,由Apache孵化开发

2.1 Well-designed Metadata Layer

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

image.png

2.2 Data File Filter

image.png

一些有助于filter的数据被层层记录,比如

l.Manifest file记录了每个data file的分区范围

2.Manifest list记录了每个manifest file的分区范围 分区可以被快速定位!可以做manifest list级别裁剪。

3.Manifest file记录了每个data file每一列的最大值 最小值可以通过其他的列(UserId)做data file级别裁 剪。

2.3 Hidden Partition

传统的分区方式:

数据中包含了date列,则按照date分区;如果希望按照hour分区,则需要新增hour列

Iceberg的分区方式:

  • 数据中包含timestamp列,设置好partition transform方式

    • 设置为date时,iceberg帮你转化为date分☒
    • 设置为hour时,iceberg帮你转化为hour分区
  • Iceberg记录了这层转化关系,并且按你的需要进行partition evolution