基于本文回答

播面 播面

刷题像听歌,多听自然懂
0
评论

Paimon 中的“主键表(Primary Key Table)”与“仅追加表(Append-only Table)”在底层的存储结构、文件归并和读写行为上有何本质区别?

知识点图片

基于 Apache Paimon 官方文档,主键表(Primary Key Table)与仅追加表(Append-only Table)在底层的存储结构、文件归并和读写行为上的本质区别如下:

一、 底层存储结构的区别

  1. 主键表 (Primary Key Table)

    • LSM-Tree 物理组织:主键表以分区和 Bucket(桶)为最小读写单位,每个 Bucket 底层都对应一棵独立的 LSM-Tree。
    • Sorted Runs(排序段):数据先在内存缓冲(MemTable)中按主键进行排序,溢写到磁盘后形成多个 Sorted Runs。每个数据文件内部的数据行严格按主键排序,同一个 Sorted Run 内的文件主键范围互不重叠,但不同 Sorted Runs 之间主键范围允许重叠。
    • 辅助文件:除了存储具体行数据的数据文件外,还包含用于记录删除标记的 Deletion Vector 文件,或用于流式下游消费的 Changelog 变更日志文件。
  2. 仅追加表 (Append-only Table)

    • 顺序平面存储:不定义主键,不支持行级更新。数据直接以追加(+I)的方式写入底层数据文件,文件内部的数据默认无序。
    • 桶模式的选择
      • Unaware-bucket 模式bucket = -1):没有桶的概念,所有写入的文件无视并发限制,统一写入单目录中,常用于替代传统的离线 Hive 批处理表。
      • Bucketed 模式bucket > 0):通过 bucket-key 限制局部物理分桶,用来提供类似于 Kafka Partition 的局部顺序保障或进行桶裁剪过滤。
    • 通过聚集(Clustering)排序:不支持按主键自动排序,但可以在批处理模式下通过非同步的 Z-Order、Hilbert 等空间填充曲线对数据列进行排序优化,以加速后续查询。

二、 文件归并 (Compaction) 的本质区别

  1. 主键表 (Primary Key Table)

    • 归并目的:合并不同 Sorted Runs 中具有相同主键的记录。通过消除重复键(Deduplicate)、部分列更新(Partial Update)或聚合计算(Aggregation),来保持主键唯一性并清理被删除的行,同时控制 LSM-Tree 的层数。
    • 归并算法:默认采用类似于 RocksDB 的 Universal Compaction。如果配置了特定的 Changelog 生产机制(如 Lookup),则会触发较激进的 Lookup Compaction,强制将 L0 文件的记录合并入更高层。
    • 合并引擎参与:在 Compaction 阶段,必须由特定的合并引擎(如 Deduplicate、Partial Update、Aggregation 等)对重叠的主键冲突进行逻辑合并与清洗。
  2. 仅追加表 (Append-only Table)

    • 归并目的仅用于解决小文件碎化问题。它将多个流式写入产生的小文件重写、合并为接近目标大小的大文件,完全不涉及数据行级别的冲突合并、去重或数据清洗
    • 归并机制
      • 在 Unaware-bucket 模式下,系统使用专用的 Compact Coordinator 扫描分区中的小文件,并将合并任务分发给 Compact Worker 线程进行异步并行重写。
      • 支持 Incremental Clustering(增量聚集归并),仅挑选部分小文件进行重写和聚集键重排,以较低的写放大代价优化整体数据布局。

三、 读写行为的区别

  1. 主键表 (Primary Key Table)

    • 写行为:支持实时的、行级别的 UPSERT、DELETE、UPDATE 写入,能够直接消费来自 CDC 的双边变更流(+I-D-U+U)。
    • 读行为
      • 读时合并 (Merge on Read):读取时必须在内存中实时对多个 Sorted Runs 进行多路归并,合并相同主键的多版本数据,因此 CPU 与 I/O 开销较大。
      • 写时合并 (Merge on Write):配合 Deletion Vector 在写时标记删除,读取时使用 DV 快速过滤已删除记录,规避了繁重的读时归并过程。
      • 支持流式 Changelog 消费。
  2. 仅追加表 (Append-only Table)

    • 写行为:在流式写场景下仅支持追加 INSERT 动作,不支持行级的流式 Upsert。只有在批处理模式下,才支持 DELETEUPDATEMERGE INTO 等语法的全表重写式更新。写吞吐极高,写放大很低。
    • 读行为
      • 极速扫描:无需进行任何主键多路归并,直接对底层文件进行顺序读取,CPU 消耗低,全表扫描效率极高。
      • 高效的数据跳过 (Data Skipping):主要依赖文件元数据(Min/Max 统计信息)、文件索引(Bloom Filter、Bitmap 索引)或分桶过滤,直接快速定位并跳过无关文件。
00:00
00:00