湖仓一体 | 青训营笔记

101 阅读4分钟

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

核心技术

TravelTime

  • 每一次写入操作,创建一个新的json文件,以递增版本号命名,记录本次新增/删除的文件。
  • 每当产生N个json,做一次聚合,记录完整的分区文件信息
  • 用checkpoint记录上次做聚合的版本号

Transaction

数据湖中的ACID:

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

原子性

  1. 用户只会读取以版本号数字命名的json文件,每次都读取到最大的版本号作为数据集的现状
  2. 新的写入写完parquet后开始写json文件,使用hash值对json文件命名,如a2fs4hfg8ee.json
  3. 直到json文件内容写入完毕,利用hdfs的renamelfAbsent能力将a2fs4hfg8 ee.json替换为000006.json,到此为止commit完成,新的读取将会以000006.json作为最新版本

事务隔离

Update写入流程:

  1. 从最新的版本中,获取需要update的分区
  2. 乐观锁先把该写入的文件全落盘,然后进入写json阶段
  3. 分几种情况:
    1. 发现版本号和一开始没区别,直接写新的版本。
    2. 发现版本号增加了,看看新增的这些版本有没有更新我要更新的分区?
      1. 没有,直接写新的版本。
      2. 有,两者都更新了同一分区,得重新update了。

Schema Evolution

lD将data和metadata的列名做一一对应!

  1. 唯一确定的ID。新增列赋予新ID。删列ID不复用。
  2. 写入数据时,ID也写入数据文件
  3. 读取数据时,用ID做映射,如果
    1. Data中没有,metadata中有:ADD
    2. Data中有,metadata中没有:DROP
    3. Data和metadata中都有同一ID,但是name不同:RENAME

开源产品

Iceberg

工作重点:

  • 用户体验
    1. Schema evolution
    2. Partition evolution
    3. Hidden partition
    4. Time Travel
    5. Version Rollback
  • 性能
    1. 快速file plan
    2. 更多的filter方式
  • 可靠性
    1. ACID Transaction
  • 完全开源,由Apache孵化开发

Well-designed Metadata Layer

image.png

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

Data File Filter

image.png

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

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

Hidden Partition

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

Iceberg的分区方式:数据中包含timestamp列,设置好partition transform方式:

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

Hudi(Hadoop Upsert Delete and Incremental)

工作重点:

  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孵化

image.png

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

Delta Lake

工作重点:

  1. ACID Transaction
  2. Schema校验(不是evolution)
  3. 流批一体
  4. Time Travel
  5. Upsert/Delete
  6. Z-Order优化
  7. 只开源了一部分,由Databricks自己主导开发,Z-order等优化的实现未开源

技术选型

短期来看:每个项目都有一些属于自己的功能:

  • 如果强需求Upserts,也许Hudi是最好的选择
  • 如果希望可扩展性强,那么设计优良的Iceberg是最好的选择
  • 如果希望用上Z-Order等优化,那么掏钱买Databricks的企业版Delta是不二之选

长期来看:数据湖取代Hive,成为HDFS上的表格式标准是必然的,在选择之前问自己四个问题:

  • 我需要的feature在哪个数据湖上是最稳定的
  • 哪一个数据湖能够用最简单的接入方式(SQL)用上最完善的功能
  • 哪一个数据湖有计算引擎侧的支持和社区的支持
  • 哪一个数据湖的版本管理做的最好,最鲁棒