1. 快照
Iceberg会随着时间的推进,跟踪表生命周期中的所有数据集变化,并使用快照(Snapshots)来表示每一次变化后的数据集合,每一次数据操作的事务提交均会产生一个快照,并将其记录在元数据文件(Metadata)中。
基于快照的概念,Iceberg有以下特性:
- 事务性:写入快照成功可读,读写分离;
- 时间旅行:可指定Snapshot Id读取任意保留快照时刻的数据集,默认读取最新的快照:
- 利用Spark SQL Hint实现时间旅行读取id = 1234512512541快照的数据集(时间旅行语法后续可能变动,仅作参考)
SELECT * FROM iceberg_zjyprc_hadoop.iceberg.sample_table /*+options('snapshot-id'='1234512512541')*/;
- 快照回滚:可指定Snapshot Id回滚到任意保留快照时刻的数据集,回滚后新快照基于回滚快照继续提交:
将表回滚到id = 123456789的快照数据集
CALL iceberg_zjyprc_hadoop.system.rollback_to_snapshot('iceberg.sample_table', 123456789);
2. 表版本
Iceberg目前支持两种版本的表:
- Format V1:不可变文件格式(Parquet、ORC、Avro)的大型分析表。V1表可以平替Hive表,支持以下写入操作:
- 常规Append、Overwrite操作;
- 还支持Copy On Write模式(下文介绍具体含义)的Delete、Update、Merge Into行级更新能力。
- Format V2:V2表在V1表的能力的基础上,引入了Equality delete files和Position delete files两种删除变更文件,增加了Merge On Read模式(同下文介绍)下基于主键通过Delete、Update、Merge Into进行行级更新的能力。
3. 行级更新模式
Copy On Write(写时复制)
在Copy On Write模式下,Iceberg会首先读取原始目标数据文件,将其中需要变更的数据删除或更新后,产生新的数据文件,并提交到新的快照用于替换原先的数据文件。
- 优点:
- 写入时不会产生变更删除文件;
- 在读取时不需要进行读取合并。
- 缺点:
- 频繁地、大量地更新和删除,在读取完历史数据后,可能追加较多新数据,对写入操作产生较大的压力;
- 对下游流式消费造成较大数据波动。
- Spark Copy On Write模式下Merge Into示例:<