3. 湖仓一体核心概念

在金融历史行情场景中,数据量以 TB 级起步,且同时存在逐笔成交、快照行情、K 线聚合、因子指标、回测结果等多类数据。要理解湖仓一体,先要厘清三个基础概念:数据湖、数据仓库和 Lakehouse。它们不是简单的替代关系,而是围绕“存储成本、数据质量、计算灵活性”三者的不同取舍。

一、核心定义与本质差异

数据湖以低成本对象存储(如 S3、OSS、HDFS)为底座,采用“先存后治理”模式,原始数据以文件形式落地,Schema 在读时定义(Schema-on-Read)。它擅长承载海量原始行情、日志和半结构化数据,但缺乏事务、约束和高效元数据管理,容易退化为“数据沼泽”。

数据仓库采用“先建模后写入”模式,Schema 在写时定义(Schema-on-Write),强调强一致、ACID 事务和结构化 SQL 分析。它数据质量高、查询性能稳定,但存储与计算耦合、扩展成本高,对非结构化数据和半结构化行情适配较弱。

Lakehouse是在数据湖之上引入表格式(Table Format)与元数据层,使对象存储具备事务、Schema 演进、时间旅行等数仓能力。它既保留数据湖的低成本与开放性,又提供数仓级的数据管理与查询性能,是金融行情湖仓建设的主流形态。

数据湖 · 数据仓库 · Lakehouse 能力对比 数据湖 Schema-on-Read 低成本对象存储 原始行情/日志/半结构化 无事务、弱治理 易成数据沼泽 适合:原始逐笔、快照 归档、冷数据 数据仓库 Schema-on-Write 强 ACID 事务 结构化建模、SQL 分析 数据质量高、性能稳 存储计算耦合、成本高 适合:K线聚合、因子 报表、风控指标 Lakehouse 湖存储 + 表格式 ACID + Schema 演进 时间旅行、批流一体 开放格式、多引擎 低成本 + 数仓能力 适合:全链路行情 回测、实时因子

二、表格式的核心机制

Lakehouse 的关键在于表格式层。它位于计算引擎与对象存储之间,用元数据文件记录“哪些数据文件构成一张表”,从而在文件之上实现事务、快照和 Schema 管理。目前主流的三类表格式机制如下:

  • Delta Lake:以 _delta_log 事务日志为核心,每次提交生成一个 JSON 日志,记录新增/删除文件与元数据变更。支持 ACID、时间旅行、Schema 演进和 MERGE 更新,与 Spark 生态结合最紧密。
  • Apache Iceberg:采用分层元数据(metadata file → manifest list → manifest file → data file),支持隐藏分区、分区演进和快照隔离。多引擎兼容性好,适合 Flink、Spark、Trino 混合查询。
  • Apache Hudi:以时间线(Timeline)管理提交,区分 Copy-on-Write 与 Merge-on-Read 两种表类型。擅长增量写入和近实时更新,适合高频行情落湖与增量拉链。

核心判断:表格式解决的不是“存什么”,而是“怎么在文件之上安全地改、查、回溯”。没有表格式,对象存储只是文件堆;有了表格式,才具备湖仓语义。

三、选型对比与金融行情场景

维度 Delta Lake Apache Iceberg Apache Hudi
元数据机制 事务日志 JSON 分层元数据 + Manifest Timeline + 文件组
更新模式 Copy-on-Write 为主 快照 + 增量 COW / MOR 可选
多引擎支持 Spark 最佳,Trino 可用 Spark/Flink/Trino 广泛 Spark/Flink 为主
流式写入 支持,微批为主 Flink 集成成熟 近实时增量强
金融行情适配 K线聚合、回测快照 多引擎因子查询 逐笔增量入湖

在金融历史行情湖仓中,常见组合是:Hudi 承接逐笔与快照的增量入湖,Iceberg 承载多引擎因子与指标查询,Delta Lake 用于回测快照与实验版本管理。选型不应追求单一表格式统一,而应按数据写入频率、查询引擎和更新模式分层选择。

四、常见误区与复盘

误区一:把数据湖直接当数仓用。原始文件缺少事务和元数据,并发写入会产生脏读,回测结果不可复现。

误区二:认为 Lakehouse 等于“湖 + 仓”物理拼接。真正的湖仓一体依赖表格式统一元数据,而不是两套系统简单互拷。

误区三:忽视小文件问题。行情数据高频写入会产生大量小文件,需通过 OPTIMIZE、COMPACTION 或 rewrite_data_files 定期合并。

-- Iceberg 小文件合并示例
CALL catalog.system.rewrite_data_files(
  table => 'market.tick',
  options => map('target-file-size-bytes','134217728')
);

-- Delta Lake 优化与清理
OPTIMIZE market.kline ZORDER BY (symbol, trade_date);
VACUUM market.kline RETAIN 168 HOURS;

复盘要点:湖仓一体的价值不在“存得下”,而在“改得动、查得快、回得去”。表格式是连接低成本存储与高可信分析的桥梁,选型时优先看写入模式、查询引擎和更新频率,而非单纯比较功能清单。