Iceberg 写入和更新模式,COW,MOR(Copy-on-Write,Merge-on-Read)
1. 追加写入
特点
- 只新增数据,不更新表中已有的数据。
适用场景
- Spark: 使用
insert into
写入 v1 和 v2 表。 - Flink Batch: 使用
insert into
写入 v1 和 v2 表。 - Flink Streaming: 使用
insert into
写入 v1 表。
2. 覆盖写入
特点
- 覆盖表的指定分区,更新粒度为分区级别。
- 不进行数据去重,不保证主键唯一性,即使是 v2 表也不例外。
适用场景
- Spark: 使用
insert overwrite
写入 v1 和 v2 表。 - Flink Batch: 使用
insert overwrite
写入 v1 和 v2 表。
3. 行级更新
语法
- Spark 支持: 使用
merge into
、delete from
、update
。
更新模式
- Two modes: Copy-On-Write (CoW) and Merge-On-Read (MOR) with copy-on-write as the default.
- 可通过以下表参数修改:
表参数 | 值 |
---|---|
write.delete.mode | copy-on-write , merge-on-read |
write.merge.mode | copy-on-write , merge-on-read |
write.update.mode | 仅支持 copy-on-write |
Copy-On-Write 模式 (CoW)
https://en.wikipedia.org/wiki/Copy-on-write
Copy-On-Write 模式在 v1 表或者 v2 表都可以使用。
工作原理
- 读取原始数据: 读取与更新匹配的文件或片段。
- 应用更新: 在内存中处理数据,将修改应用于数据。
- 写入新文件: 将更新后的数据写入新文件。
- 元数据更新: 更新元数据以指向新的数据文件。
特点
-
OLAP 读取友好:
- 数据一致性:旧文件不受写操作影响。
- 优化查询性能:新建文件针对大规模查询优化。
- 避免碎片化:每次修改生成新文件。
-
OLAP写不友好:
- 高 I/O 开销:需重写整个文件。
- 长延迟:因需要重写文件和更新元数据。
-
对 Flink 流式处理不友好:
- 实时性差:新文件生成和元数据更新延迟。
- 高延迟读取:处理新文件增加复杂性。
Merge-On-Read 模式 (MOR)
特点
- 仅适用于设置主键的 v2 表。
工作机制
-
读取和写入操作:
- 读取现有记录并写入新文件。
- 删除文件记录待删除行,数据文件存储新或更新行。
-
追加机制:
- 仅追加新文件,不重写整个数据文件。
性能特点
-
写友好:
- 优化写操作:追加新文件降低写操作成本。
- 适合频繁数据更新的用例。
-
OLAP 查询性能:
- 可能较慢:因合并读取增加计算开销。
-
Flink 流处理友好:
- 追加特性适应流处理框架,确保高效数据摄取和流读取。