2. 湖仓架构基础

在金融行业的数据平台演进中,我们经常听到"数据湖""数据仓库""湖仓一体"以及 Delta Lake、Iceberg、Hudi 这些名词。它们并非简单的营销概念,而是针对不同阶段数据管理痛点的技术回应。理解它们的核心差异,是后续小文件治理与 Compaction 实战的前提。

一、核心原理:三种架构范式的本质区别

数据仓库以 Schema-on-Write 为核心,数据在写入前必须经过清洗、建模,采用星型或雪花模型组织。它的优势是查询性能高、数据质量可控,适合 BI 报表与监管报送;但扩展成本高,对半结构化数据和非结构化数据支持弱,且难以承载机器学习所需的原始明细数据。

数据湖以 Schema-on-Read 为核心,通常构建在 HDFS 或对象存储之上,可以低成本存储任意格式的原始数据。它解决了仓库扩展性差的问题,但缺乏事务保证、缺少元数据管理,容易退化为"数据沼泽"——数据很多,却难以找到、难以信任。

湖仓一体试图在数据湖的低成本存储之上,叠加数据仓库的事务能力、Schema 管理和性能优化。它既保留开放格式,又提供 ACID、时间旅行、增量读取等能力。Delta Lake、Iceberg、Hudi 正是实现湖仓一体的三大主流表格式。

湖仓一体表格式能力对比 Delta Lake 事务日志 _delta_log ACID + 时间旅行 Spark 生态深度集成 Z-Order 数据聚簇 OPTIMIZE 合并小文件 VACUUM 清理旧版本 金融场景:批流一体入湖 Databricks 生态首选 Apache Iceberg 三层元数据:Catalog Metadata / Manifest 隐藏分区 + 分区演进 引擎无关,多引擎共享 Rewrite Data Files 治理 快照隔离与回滚 金融场景:多引擎开放湖 跨部门数据共享 Apache Hudi Timeline 时间轴 COW / MOR 两种表类型 Upsert 与增量拉取 Clustering 小文件治理 Compaction 合并日志 记录级索引 金融场景:CDC 实时入湖 高频更新交易流水

二、方法流程:三大表格式的写入与治理机制

三者都通过元数据层实现 ACID,但组织方式不同。Delta Lake 使用单一事务日志目录 _delta_log,每次提交生成一个 JSON 文件,记录新增和删除的文件清单;Iceberg 采用 Catalog → Metadata → Manifest → Data File 的四层结构,元数据可独立于计算引擎;Hudi 则维护一条 Timeline,将 commit、compaction、clustering 等操作按时间排列。

以 Hudi 的 MOR 表为例,写入流程如下:

# 写入时先追加到日志文件(Avro 格式)
hoodie write --table-type MERGE_ON_READ \
  --op UPSERT \
  --target-table trade_flow

# 达到阈值后触发 Compaction,将日志合并为列式 Parquet
hoodie compaction run \
  --table trade_flow \
  --compaction-trigger-strategy DELTA_COMMITS \
  --compaction-delta-commits 5

# 小文件治理:Clustering 按大小重分布
hoodie clustering run \
  --table trade_flow \
  --clustering-plan-size 128MB

Delta Lake 的治理命令更简洁:

-- 合并小文件并重写为 128MB 目标大小
OPTIMIZE trade_flow
  WHERE dt >= '2024-01-01'
  ZORDER BY (account_id);

-- 清理超过 7 天的旧版本文件
VACUUM trade_flow RETAIN 168 HOURS;

Iceberg 则通过 rewrite_data_files 过程完成类似工作,并支持按分区并行执行。

三、金融场景选型:从业务特征出发

选型维度 Delta Lake Iceberg Hudi
典型写入模式 批流一体、追加为主 批量重写、分区演进 高频 Upsert、CDC
引擎兼容性 Spark 最佳,其他较弱 Spark/Flink/Trino 均好 Spark/Flink 较好
小文件治理手段 OPTIMIZE + Z-Order Rewrite Data Files Clustering + Compaction
金融适配场景 Databricks 湖仓、报表加速 多引擎开放湖、数据共享 交易流水 CDC、实时风控
时间旅行 支持 支持 支持(有限)

在金融实践中,选型往往不是非此即彼。例如,某银行在实时风控链路使用 Hudi 承接 CDC 交易流水,利用 MOR 表实现秒级 Upsert;在离线报表层使用 Iceberg 构建开放湖,供 Spark、Trino、Flink 多引擎共享;在 Databricks 平台上则用 Delta Lake 做特征工程与模型训练。关键是根据写入频率、更新比例、查询引擎和治理成本综合判断。

四、误区与复盘:选型中的常见陷阱

误区一:认为湖仓一体就是"数据湖 + 数据仓库"的简单叠加。实际上,湖仓一体的核心是表格式带来的事务与元数据能力,没有这层,湖和仓仍然是割裂的。

误区二:忽视小文件问题的架构根源。无论选择哪种表格式,高频写入、分区过细、并发提交都会产生小文件。Compaction 不是可选项,而是必须纳入日常调度的治理动作。

  • 复盘要点一:选型前先明确写入模式——是追加、覆盖还是 Upsert,这直接决定 COW 与 MOR 的取舍。
  • 复盘要点二:评估查询引擎矩阵,若存在 Trino、Flink、Spark 多引擎共享需求,Iceberg 的开放性更具优势。
  • 复盘要点三:将 Compaction 与 Clustering 纳入 SLA 管理,设置文件大小阈值与调度频率,避免小文件累积到影响查询性能才被动处理。
  • 复盘要点四:元数据规模同样需要治理,Iceberg 的 Manifest 和 Delta 的日志文件过多时,也会成为查询瓶颈。

理解这三种表格式的差异与适用边界,是后续深入 Compaction 参数调优、文件大小策略和调度设计的基础。在金融场景中,没有绝对最优的格式,只有与业务写入特征、查询模式和治理能力最匹配的选择。