一、概述

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 得到终的结果。

table format

目前两种表在创建时需要在表的 options 中显示指定,如果不指定则默认为 V1 版本

2.1. V1

2.2. V2

三、文件布局

3.1. 设计

Iceberg 文件布局可以分为数据层(Data Layer) 和元数据层(Metedata Layer)。数据层是一系列实际存储数据记录的文件,而元数据层包括元数据描述文件、清单列表文件(Manifest List)、以及清单文件(Manifest File)。三类文件通过层级关系相互关联起来。

四、数据写入

如图所示,Iceberg 在数据写入的时候:

  1. Iceberg 先把数据写入到 DataFile 文件中
  2. 当一组 DataFile 文件写完之后,会根据这个 DataFile 文件中 column 的一些统计信息(如: 每个 column 的 min/max 值),生成一个对应的 manifest 文件
  3. 然后 Iceberg 把一次写入后涉及到的 manifest 文件组成一个 manifest list, manifest list 文件中也会存入一些相 manifest 的统计信息(如: 分区信息等)
  4. 然后按照整个 manifest list 生成一个对应的 snapshot 文件
  5. 生成完 snapshot 文件之后,Iceberg 会把当前 snapshot 的 ID 及存储路径等信息写人到 metadata.json 中。
  6. 当一切准备完毕之后,会以原子操作的方式提交元数据文件 metadata.json

五、数据读取

5.1. 数据过滤

在 Iceberg 中自上而下买现了三层的数据过滤策路分别是: 分区裁剪、文件过滤和 RowGroup 过滤。