数据湖-Iceberg-源码学习-Table Format 设计
一、概述
Iceberg 是一种开放的数据湖 Table Format,其基于计算层 (Flink,Spark) 和存储层 (ORC,Parqurt,Avro) 的一个中间层,通过特定的方式将数据和元数据组织起来。
二、类型
Iceberg 表格式目前有两个版本: V1 表和 V2 表。V1 表的更新采用 Copy On Write (COW) 模式,将需要更新的文件读取出来做更新后再写入。在V2 表中除了 Copy On Write,还增加了 Merge On Read (MOR),支持行级别删除(Row-level delete)、更新(Update) 等操作。MOR 通过记录另外两个文件,即 Position delete 和 Equality delete 文件对已有的文件进行删除,当读取的时候进行 merge 得到终的结果。
目前两种表在创建时需要在表的 options 中显示指定,如果不指定则默认为 V1 版本
2.1. V1
2.2. V2
三、文件布局
3.1. 设计
Iceberg 文件布局可以分为数据层(Data Layer) 和元数据层(Metedata Layer)。数据层是一系列实际存储数据记录的文件,而元数据层包括元数据描述文件、清单列表文件(Manifest List)、以及清单文件(Manifest File)。三类文件通过层级关系相互关联起来。
引用本站文章
数据湖-Iceberg-源码学习-Kernel-Table Format-FileLayouts 设计
Joker
四、数据写入
如图所示,Iceberg 在数据写入的时候:
- Iceberg 先把数据写入到 DataFile 文件中
- 当一组 DataFile 文件写完之后,会根据这个 DataFile 文件中 column 的一些统计信息(如: 每个 column 的 min/max 值),生成一个对应的 manifest 文件
- 然后 Iceberg 把一次写入后涉及到的 manifest 文件组成一个 manifest list, manifest list 文件中也会存入一些相 manifest 的统计信息(如: 分区信息等)
- 然后按照整个 manifest list 生成一个对应的 snapshot 文件
- 生成完 snapshot 文件之后,Iceberg 会把当前 snapshot 的 ID 及存储路径等信息写人到 metadata.json 中。
- 当一切准备完毕之后,会以原子操作的方式提交元数据文件 metadata.json
引用本站文章
数据湖-Iceberg-源码学习-Kernel-Table Format-数据写入
Joker
五、数据读取
5.1. 数据过滤
在 Iceberg 中自上而下买现了三层的数据过滤策路分别是: 分区裁剪、文件过滤和 RowGroup 过滤。
引用本站文章
数据湖-Iceberg-源码学习-Kernel-Table Format-数据读取-数据过滤-设计
Joker
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Joker!
评论
ValineTwikoo











