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

193 阅读4分钟

01.发展历史

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

Hadoop

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

(2)使用目录来区分不同的数据集 好处:

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

image.png 坏处:

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

Hive

hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句转变成任务来执行。Hive的优点是学习成本低,可以通过类似SQL语句实现快速MapReduce统计,使MapReduce变得更加简单,而不必开发专门的MapReduce应用程序。hive是十分适合数据仓库的统计分析和文件。

(1)数据湖的演进 —— Hive Metastore

(2)对数据湖中的数据集进行集中“定义”

  • 数据湖中存在了哪些数据集

  • 它们都存储在什么目录

  • 数据集的schema是什么样子的

  • 数据集有哪些分区,每个分区的目录是什么

image.png

湖仓一体

(1)什么是数据仓库?

  • 数据仓库将数据从数据源提取和转换,加载到目的地

  • 数据仓库存储+计算不分离

  • 数据仓库严格控制写入数据的schema

image.png

image.png

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

(1)结合了数据湖和数据仓库的优势

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

(3)Key Features:

  • Transaction ACID

  • Schema管理

  • 存储计算分离

  • 支持多种计算引擎和文件格式

02.核心技术

Time travel

要点:

  • 每次写入都生成-一个新的元数据文件,记录变更

  • 分区数据在Update时,不要删除旧数据,保证新旧共存

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

Transaction:事务性,数据湖的 ACID

(1)原子性:写入要么可见要么不可见,先写入 parquet 文件,以 Hash.parquet 文件存储,写完后写 Hash.json,写完后尝试重命名为版本号.json,如果失败就无法 commit,新写入在没有 commit 前用户无法读取(用户只读当前 最大版本号.json)

(2)一致性:计算引擎保证

(3)事务隔离:读写和写写冲突,由于新写入不替换原数据,故读写冲突已解决。Update 时采用乐观锁,先全写文件,进入写 json,看版本号有无变化,若变化,查看新增版本是否更新我要更新的分区,没有则写新版本,有则重新 update。

(4)持久性:存储引擎保证

Schema Evolutio

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

(2)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