数据湖-Iceberg-源码学习-Kernel-Table Format-FileLayouts 设计
一、概述
Iceberg 文件布局可以分为数据层(Data Layer) 和元数据层(Metedata Layer)。数据层是一系列实际存储数据记录的文件,而元数据层包括元数据描述文件、清单列表文件(Manifest List)、以及清单文件(Manifest File)。三类文件通过层级关系相互关联起来。
二、架构设计
2.1. Catalog
Iceberg Catalog API 用来保存和查找表的元数据,比如 Schema、 属性信息等。

2.2. Metadata Layer
Iceberg 数据表每一次的修改后的状态都会在 Metadata Layer 层中生成一个 Snapshot (0,S1) 文件,Snapshot 文件中包含一个 Manifest List, List 中存储了当前的 Snapshot 状态是由哪些 Manifest 文件组成。每个 Manifest 的文件会指向到真实数据的存储文件 DataFile(一般是 parquet 格式)。
2.3. Data Layer
Data Layer 通常在表存储目录的 data 子目录下,存放的是实际数据记录的文件,文件的格式在建表时指定,默认为 parquet, 也可以指定为 orc、 text 等支持的类型,在有定义分区字段的表中,数据写入时会接照分区字段的值依次创建子目录,最终的数据文件则存放在这些子目录中。
Iceberg 其定位是在存储引擎(HDFS、S3)之上,计算引擎(Flink Spark)之下的 Table Format, 所以数据文件实际上位于存储引擎(HDFS、S3)。
三、文件布局优化
3.1. 小文件
Iceberg 每次快照都产生了大量的文件,包括 Manifest 文件和数据文件,以及快照文件和上述这些文件的校验文件。当存在删除更新操作,Manifest 文件和数据文件又拆分出来删除类型的对应文件,当快照执行频率过高且每次操作数据量较小时,会产生大量的小文件,从而导致系统性能减弱,为解决这类问题,Iceberg 也提供了相应的文件合并、重写等操作来减轻这类问题。











