订阅更新

数据湖 Compaction、Clustering 和 Vacuum 有什么区别?

面试问 199 约 3 分钟读完

本文目录
  1. 面试怎么回答
  2. Compaction 解决文件粒度
  3. Clustering 解决数据布局
  4. Vacuum 解决存储回收
  5. 执行顺序要看目标
  6. 维护任务也会制造成本和冲突
  7. 不同表格式名称可能不同
  8. 参考资料

面试怎么回答

Compaction 主要把小文件合并成目标大小,降低元数据和文件打开成本;Clustering 按常用过滤维度重排记录,改善文件统计和裁剪;Vacuum 或快照过期清理删除不再被有效版本引用的旧文件,释放存储。它们分别优化文件粒度、数据布局和生命周期,不能互相替代,执行时还要保护时间旅行、长查询与并发写入。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

“表有小文件,跑个 Vacuum 就好了。”

这句话把三个完全不同的问题混在了一起:文件太碎、数据布局不利于查询、历史文件需要回收。

Compaction 合并小文件,Clustering 重排数据布局以改善裁剪与局部性,Vacuum 或过期清理回收不再被有效快照引用的文件;三者目标、重写范围和风险不同。

Compaction 解决文件粒度

流式或小批写入会产生大量小文件,增加元数据、文件打开和调度成本。Compaction 把多个小文件重写为更接近目标大小的文件,主要优化扫描开销。它不一定改变数据的排序或聚集方式。

Clustering 解决数据布局

当查询经常按用户、时间或地区过滤,而数据在文件中随机散布时,单纯合并文件仍要扫描很多文件。Clustering、Z-Order 或排序重写会按常用维度重新组织记录,让文件级统计更有区分度,从而提高裁剪效果。

三类湖仓维护不要混用

Vacuum 解决存储回收

表格式为事务、回滚和时间旅行保留旧快照及文件。只有快照过期、保留策略满足后,那些不再被任何有效引用使用的文件才能安全删除。Vacuum 不会自动把小文件合并,也不会让当前文件布局更适合查询。

执行顺序要看目标

若先重写数据,通常会产生新的文件和快照;随后再按保留策略过期旧快照并清理无引用文件,才能释放空间。但保留窗口必须覆盖长查询、流式 Checkpoint、分支标签和回滚需求,不能为了省存储立刻删除。

维护任务也会制造成本和冲突

重写文件会消耗大量读写 I/O、产生提交并发冲突,并让缓存失效。应该按分区、小文件比例、查询收益和变更热度选择范围,避免每天无差别重写整表。运行后要用文件数、平均大小、扫描文件比例和存储回收量验收。

不同表格式名称可能不同

Iceberg 常见 rewrite_data_files、rewrite_manifests、expire_snapshots 与 remove_orphan_files;Delta 常见 OPTIMIZE 与 VACUUM;Hudi 有 Compaction、Clustering 和 Cleaning。名称相似不等于语义完全相同,生产操作必须按当前表格式文档确认保留与并发边界。

参考资料

刷题进度保存在当前浏览器