湖仓一体总体架构

本页是全站总纲:先讲清湖仓一体「是什么、为什么、怎么分层」,给出六层参考架构与全景架构图;再深入批流一体的设计思路;然后看湖仓底座如何支撑 Palantir 式的本体、流水线、AI 检索与时空分析场景;最后沉淀一套可直接落地的技术选型方法论。读完本页,你将拥有贯穿后续所有章节的全局地图。

湖仓一体是什么

湖仓一体(Lakehouse)是在低成本对象存储之上,通过开放表格式(Iceberg / Hudi / Delta)实现 ACID 事务、Schema 治理与多引擎并发访问的新型数据平台架构。它保留了数据湖「海量、廉价、存原始数据」的底色,又把数据仓库数十年沉淀的事务与治理能力下沉到表格式层,用一份存储同时服务离线、实时、AI 与检索等全部负载。

开放表格式 对象存储 ACID 多引擎共享

从三代演进看湖仓的必然

数据仓库时代(1990s–2015):写时 Schema · 强治理 · 贵且封闭

数仓以「先建模、后装载」为核心:结构在写入时即被约束,质量与一致性极佳,报表生态成熟。但商业数据库按容量计费,扩容成本陡峭;封闭格式让数据「进得去、出不来」,ML 与探索类负载既贵又慢。

数据湖时代(2015–2020):读时 Schema · 海量廉价 · 治理缺位

HDFS 与对象存储把每 GB 成本压到分级别,原始数据先落地、结构后解析,完美适配机器学习。但湖本质是文件目录:没有 ACID、没有并发控制、没有 Schema 约束,「数据沼泽」开始出现,企业不得不再建一套仓来救湖。

湖仓一体时代(2020–):表格式承担治理 · 湖上建仓 · 一份数据

Iceberg 等开放表格式把元数据(schema、分区、快照)从引擎私有目录中解放出来,变成存储之上的「公共合同」:任何引擎按协议读写即可获得事务与演进能力。治理不再是仓的专属,湖第一次拥有了数据库级别的可靠性。

注意:湖仓一体 ≠ 把数据扔进对象存储。没有表格式层,并发写入互相覆盖、小文件拖垮扫描、Schema 漂移无人兜底——缺了事务与元数据管理这一层,就谈不上「湖仓」,只是换了个目录放文件。

三大核心价值

一份数据多引擎共享:Spark、Flink、Trino、Doris 通过统一 Catalog 读写同一张表。数据零搬运意味着零口径漂移、零重复存储成本,新引擎接入只需对接开放协议。
ACID 事务保障:表格式以快照(snapshot)为单位提交变更,写入失败不污染数据;读写基于快照隔离,流式写入与批式回刷、交互查询可以安全并发。
开放表格式解耦:元数据规范公开、文件格式标准(Parquet/ORC),存储、计算、查询可独立升级替换。厂商绑定的历史难题在存储层被结构性化解——这正是「架构师选型底气」的来源。

下面这段配置展示了「多引擎共享」的落地面貌:三个引擎各写一份配置,却指向同一套元数据与数据文件:

# Trino catalog:etc/catalog/lakehouse.properties(挂载 Iceberg + Hive Metastore)
connector.name=iceberg
iceberg.catalog.type=hive_metastore
hive.metastore.uri=thrift://metastore.lake.local:9083
s3.endpoint=http://minio.lake.local:9000
s3.path-style-access=true

# Spark:同样指向这套元数据,无需任何数据导出或同步任务
spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
spark.sql.catalog.lakehouse=org.apache.iceberg.spark.SparkCatalog
spark.sql.catalog.lakehouse.type=hive
spark.sql.catalog.lakehouse.uri=thrift://metastore.lake.local:9083
spark.sql.catalog.lakehouse.warehouse=s3://lakehouse/wh

# Flink:批与流共享同一份元数据与数据文件,分钟级写入对批读可见
sql.catalog.lakehouse.type=iceberg
catalog.lakehouse.type=hive
catalog.lakehouse.uri=thrift://metastore.lake.local:9083
catalog.lakehouse.warehouse=s3://lakehouse/wh
最佳实践:把「统一 Metastore + 统一 Warehouse 路径 + 统一 Kerberos/ Ranger 权限」写进平台规范并纳入评审——湖仓的解耦红利只有在「三统一」被严格执行时才能真正兑现。

六层参考架构

本站全站结构都映射到这套六层参考架构。自上而下依次是:场景消费层 → 可观测性层 → 调度与资源层 → 计算与查询层 → 数据集成层 → 存储与表格式层。数据则自下而上流动:先落底座,再被加工、查询,最终在场景层产生业务价值。

场景消费层:情报研判 / AI 向量检索 / 时序分析 / GIS 空间分析 / 图计算

业务价值的出口层,回答「平台最终为谁创造什么」。情报研判需要多源关联与图谱展开;AI 向量检索需要非结构化数据入湖与特征回填;时序与 GIS 需要专用索引。该层对下的核心诉求是统一的语义入口(视图/语义层)与细粒度权限——业务方只应面向「对象与指标」编程,而非面向底层表。对应章节:场景实战。

可观测性层:Prometheus / Grafana / EFK(指标 · 日志 · 告警)

平台的「体检系统」。Prometheus 周期抓取 Spark、Flink、Trino、Iceberg 与 YARN 的指标暴露端口;EFK 汇聚各组件与业务日志;Grafana 出大盘;告警规则联动值班与调度层的失败重试。它向上承接调度层的任务级异常,向下覆盖所有组件的节点级异常,是「故障在业务感知之前被发现」的保障。对应章节:可观测。

调度与资源层:DolphinScheduler / YARN(DAG 编排 · 多租户配额)

平台的「神经系统」。DolphinScheduler 负责任务 DAG:依赖编排、定时触发、补数重跑、失败告警;YARN 负责资源:队列划分、CPU/内存配额、弹性调度。它把计算层成百上千的作业组织成可信的生产流水线,并把集群资源公平地分配给多租户。对应章节:调度资源。

计算与查询层:Spark / Flink / Trino / Doris / ClickHouse

湖仓的「双引擎矩阵」。Spark 承接大规模离线加工与 ML 训练;Flink 承接实时计算与 CDC 流式入湖;Trino 提供交互式联邦查询;Doris 服务实时多维 OLAP;ClickHouse 专攻日志与时序扫描。它们对上满足场景层的算力需求,对下通过统一 Catalog 读写同一份 Iceberg 数据——引擎之间是「分工」而非「搬运」。对应章节:计算层、查询层。

数据集成层:Kafka / Flink CDC / DataX / SeaTunnel

数据的「入湖口」。Kafka 缓冲高吞吐消息流并支持重放;Flink CDC 直连业务库订阅 binlog 实现增量入湖;DataX/SeaTunnel 承接异构批量同步。该层对上把数据交给计算层加工或直接落地表格式,对下把 Parquet 文件写入对象存储并在 Metastore 注册元数据——集成层的稳定与时效决定了整个平台的「数据鲜度」。对应章节:数据集成。

存储与表格式层:HDFS / S3·MinIO + Parquet + Iceberg + Hive Metastore

全平台唯一可信底座。对象存储(HDFS 或 MinIO 兼容 S3)提供廉价、高可用的文件底座;Parquet 提供高压缩比列存布局;Iceberg 在文件之上维护元数据树并提供快照、ACID、Schema 演进与隐藏分区;Hive Metastore 作为统一元数据中心被所有引擎共享。所有上层组件都经由开放协议访问它——这是「换引擎不搬数据」的根本保证。对应章节:存储层。

六层全景与层间数据流如下(箭头方向表示数据自下而上流动):

场景消费层 情报研判 · AI 向量检索 · 时序分析 · GIS 空间分析 · 图计算 可观测性层 Prometheus · Grafana · EFK(指标 · 日志 · 告警) 调度与资源层 DolphinScheduler · YARN(DAG 编排 · 多租户配额) 计算与查询层 Spark · Flink · Trino · Doris · ClickHouse 数据集成层 Kafka · Flink CDC · DataX · SeaTunnel 存储与表格式层 HDFS / S3·MinIO · Parquet + Iceberg · Hive Metastore 数据自下而上流动:底座 → 入湖 → 计算/查询 → 调度与可观测保障 → 场景消费
分层的意义在于「可替换」:六层之间只以开放接口衔接(SQL、REST、指标暴露协议),任何一层组件被替换都不应引发数据迁移——这是评审一个湖仓架构是否健康的金标准。

批流一体设计

「批还是流」是流式计算十几年的路线之争。Lambda 与 Kappa 给出了两代经典答案,而湖仓时代在存储层给出了第三种:

维度 Lambda 架构 Kappa 架构 湖仓批流一体
架构形态 批、流双链路,serving 层合并结果 单一流式链路,重放日志重算 批与流写同一张表格式表
代码与口径 两套代码,口径易漂移 一套代码,天然一致 一套 Schema,口径由表统一
历史回溯 批链路天然支持 受 Kafka 日志保留期约束 任意快照回溯 + 分区回刷
资源与复杂度 双倍开发运维成本 链路简单,重算耗资源 与 Kappa 相当,存储统一
时效上限 流侧秒级、批侧 T+1 全程准实时 分钟级流写,批读即时可见
适用场景 超大规模历史 + 强审计 中等规模 + 高时效 绝大多数企业数据平台

湖仓时代批流一体的核心思路:不再在引擎层强行统一批与流,而是在存储层用 Iceberg 作为批与流的共同落地形态——Flink 以小文件 + 快照提交的方式流式写入,数据在分钟级对批侧可见;Spark / Trino 基于快照批量读取与回刷;compaction 周期任务收敛小文件。两条链路并行运行、互相独立,却在同一张表上自然汇合:

流式链路(分钟级)

业务库 binlog 经 Flink CDC 进 Kafka,再由 Flink SQL 持续写入 Iceberg,checkpoint 即快照提交。

-- 链路:MySQL --Flink CDC--> Kafka --Flink SQL--> Iceberg
CREATE TABLE orders_binlog (
  order_id   STRING,
  user_id    STRING,
  pay_amount DECIMAL(12, 2),
  order_time TIMESTAMP(3),
  PRIMARY KEY (order_id) NOT ENFORCED
) WITH (
  'connector'        = 'mysql-cdc',
  'hostname'         = 'mysql-biz.local',
  'database-name'    = 'trade',
  'table-name'       = 'orders',
  'scan.startup.mode'= 'initial'  -- 首次全量 + 持续增量
);

INSERT INTO lakehouse.dwd_trade_orders
SELECT order_id, user_id, pay_amount, order_time,
       DATE_FORMAT(order_time, 'yyyy-MM-dd') AS dt
FROM orders_binlog;

批式链路(T+1 回刷)

Spark 每日重跑分区做对账与修正,Trino 直接查询最新数据——全程无数据搬运。

# Spark:每日 T+1 重跑,与流式写入共享同一张表
spark-sql --master yarn --deploy-mode cluster \
  --conf spark.sql.shuffle.partitions=800 \
  -e "INSERT OVERWRITE lakehouse.dws_trade_city
      PARTITION (dt = '2026-11-04')
      SELECT city, SUM(pay_amount) FROM lakehouse.dwd_trade_orders
      WHERE dt = '2026-11-04' GROUP BY city"

-- Trino:BI/分析师直接查询,无需等待导出
SELECT * FROM lakehouse.dws_trade_city
WHERE dt = '2026-11-04';
-- 小文件治理是批流一体的运维生命线:流写高频提交,必须定期合并
CALL lakehouse.system.rewrite_data_files(
  table   => 'lakehouse.dwd_trade_orders',
  strategy => 'binpack',
  options  => map('target-file-size-bytes', '134217728')
);
最佳实践:把「Flink checkpoint 间隔」「Iceberg 目标文件大小」「compaction 触发阈值」三者作为一个整体参数组来调优——checkpoint 越短时效越好,但文件越小;compaction 频率要跟上写入速率,否则查询侧扫描代价会指数级上升。

支撑 Palantir 式数据体系

Palantir Foundry 证明了数据平台的终极形态不是「一堆表」,而是本体(Ontology)+ 流水线(Pipeline)+ 应用:把业务对象、关系与动作映射为数据之上的语义层,让决策直接在模型上发生。湖仓底座恰好为这套体系提供了全部四类基础能力:

一个简化的本体定义(YAML 节选),可以直接架在湖仓的实体表之上:

# 语义层本体定义示例(节选):对象映射到 Iceberg 实体表
ontology:
  object_types:
    - name: SalesOrder                  # 业务对象:销售订单
      primary_key: order_id
      source_table: lakehouse.dwd_sales_order
      attributes:
        - { name: order_amount, type: decimal(12,2) }
        - { name: customer_id,   type: string }
        - { name: order_time,    type: timestamp }
  link_types:
    - name: PlacedBy                    # 关系:订单 ← 下单客户
      source: SalesOrder
      target: Customer
      cardinality: many-to-one
  actions:
    - name: RefundOrder                 # 动作:可回写业务系统
      input: [ order_id, reason ]
      target_service: erp-refund-api

四类上层场景对底座的能力要求汇总如下:

上层场景 对湖仓底座的能力要求 主要承载组件
本体建模 统一元数据、主外键与血缘、细粒度权限、语义层视图 Iceberg + Hive Metastore + 治理体系
数据流水线 批流一体写入、DAG 编排、断点重跑、鲜度监控 Kafka + Flink + DolphinScheduler
AI 检索 非结构化存储、特征工程、向量索引与回写 MinIO + Spark + 向量库 + Trino 服务
时空分析 空间索引、时序窗口、高压缩扫描、GIS 函数 ClickHouse + Parquet + 专用查询引擎
提示:本体层是湖仓的「语义皮肤」——底座保证数据可信,本体保证数据可用。没有语义层的湖仓再快也只是「更快的报表工具」;这也是本站把场景消费层放在架构最顶端的原因。

技术选型方法论

湖仓组件多、迭代快,选型最容易犯两类错误:要么追新求全引入「全家桶」,要么保守扎堆堆叠历史包袱。以下五原则是评审任何湖仓选型方案的锚点:

  1. 开放标准优先:表格式与文件格式必须选开放标准(Iceberg / Parquet),确保数据与元数据不被任何单一引擎或厂商私有化——这是湖仓架构的「宪法条款」。
  2. 一专多能:优先选择能同时覆盖多个场景的组件(如 Trino 既是联邦查询器又是即席分析引擎),把组件总数压到最小;每多一个组件就多一份运维成本。
  3. 社区活跃度:看 commit 频率、issue 响应速度、版本发布节奏与中文资料密度;一个两年不发版的「明星项目」比一个默默迭代的工具更危险。
  4. 运维成本:评估团队熟悉度、部署复杂度、监控暴露成熟度与故障处理手册;选「团队能驾驭的最优解」,而不是「纸面上的最强解」。
  5. 国产化适配:DolphinScheduler、Doris、MinIO、SeaTunnel 等国产开源组件已在湖仓栈中占据主流,中文社区与信创环境适配是实打实的减分加分项。

落到具体场景,本站的推荐组合如下(后续各章会给出完整的选型对比与理由):

典型场景 推荐组合 选型理由
实时入湖(CDC) Flink CDC + Kafka + Iceberg 免手工同步、分钟级鲜度、可重放
离线批处理 Spark on YARN + Iceberg 生态最成熟、大规模 shuffle 稳定
交互式 / 联邦查询 Trino 或 Doris 秒级返回、多数据源联邦
日志 / 时序分析 ClickHouse + Kafka 高压缩列存、极致扫描吞吐
任务调度 DolphinScheduler 国产开源、DAG 可视化、多租户
对象存储 HDFS 或 MinIO(S3 协议) 低成本、标准接口、易扩容
指标与告警 Prometheus + Grafana 事实标准、生态最全
日志检索 EFK(Elasticsearch + Filebeat + Kibana) 全文检索强、采集端轻量
警惕「全家桶」陷阱:同时引入 Iceberg + Hudi + Delta 三种表格式、四五种查询引擎再配多套调度,不是架构领先而是治理灾难。任何新组件的引入都必须回答:它替代了谁?不可替代的理由是什么?谁负责它的值班?
最佳实践:为每次选型写一页「决策记录」(ADR):背景、备选方案、决策理由、否决理由、复评时间。三个月后回看 ADR,是校准团队选型品味最有效的训练方式。

建立全局地图后,建议按「存储 → 计算 → 查询 → 集成」的顺序进入六层技术栈的细节学习:

存储层

对象存储、Parquet 与 Iceberg 表格式的内部机制:快照、元数据树、隐藏分区与 compaction。

进入学习 →

计算层

Spark 与 Flink 的资源模型、批流一体写法与生产参数配置。

进入学习 →

查询层

Trino / Doris / ClickHouse 的原理、选型边界与联邦查询实践。

进入学习 →

数据集成

Kafka、Flink CDC、DataX / SeaTunnel 的入湖链路设计与容错实践。

进入学习 →
下一步:底座决定上层建筑。建议从存储层开始——把 Iceberg 的快照与元数据机制吃透后,再回头看本页的批流一体设计,会有完全不同的理解深度。