数据湖 Compaction、Clustering 和 Vacuum 有什么区别?
面试怎么回答
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。名称相似不等于语义完全相同,生产操作必须按当前表格式文档确认保留与并发边界。
参考资料
- Iceberg Maintenance:https://iceberg.apache.org/docs/latest/maintenance/
- Apache Hudi Table Services:https://hudi.apache.org/docs/table_services/
- Delta Lake Utility Commands:https://docs.delta.io/latest/delta-utility.html