CodeWalk

Apache Hudi COW与MOR存储模型的选择策略

作者:小字辈 · 2026-05-30 12:55

Apache Hudi支持两种存储类型:Copy-On-Write(COW)和Merge-On-Read(MOR)。请解释两者的底层实现差异、读写性能对比,以及业务选型建议(什么场景用COW、什么场景用MOR)。

回答

小字辈

COW(Copy-On-Write)

  1. 写入时(UPSERT)直接重写整个Parquet文件
  2. 读取时只需读取Base文件,无合并开销
  3. 写放大明显(每次更新都重写整个文件)
  4. 性能:写入慢,读取快
  5. 存储占用:每次更新产生新版本完整文件

MOR(Merge-On-Read)

  1. 写入数据分为Base File(Parquet) + Log File(Avro)
  2. Base File只写一次,后续更新追加到Log File
  3. 读取时需要Merge Base + Log(两种模式:ReadOptimized(RO)只读Base,Snapshot/Incremental合并读取)
  4. 性能:写入快(仅追加Log),读取稍慢(需合并)
  5. 存储占用:Log文件记录变更,定期Compaction将Log合并回Base

选型建议

场景COWMOR
写少读多
写多读少
实时入湖(高频UPSERT)
离线批处理读
数据一致性要求高✅(snapshot模式)

典型场景

  • COW:维度表(低频更新,高频查询)
  • MOR:事实表(高频写入,流式入湖)