1. Lakehouse架构与企业数据平台演进

企业数据平台在过去二十年经历了三次明显的架构跃迁:以关系型数据库为核心的数据仓库、以低成本对象存储为核心的数据湖,以及把两者能力统一到同一份数据上的Lakehouse(湖仓一体)。理解这三者的驱动力、能力边界与代价,是判断“什么时候该用哪种架构、Databricks 在其中的定位是什么”的前提。

一、三代架构的驱动力与代价

数据仓库的核心价值是强 Schema、事务一致性与高性能 SQL。它把数据先清洗、建模(如星型模型、雪花模型)再入库,因此 BI 报表口径稳定、查询快。代价是:存储与计算强耦合,扩容成本高;只能处理结构化数据;对半结构化日志、图像、文本、IoT 时序等数据支持差;Schema 变更需要停机式 ETL 改造。

数据湖的出现正是为了解决“存得下、存得便宜、什么格式都能存”。它把原始数据以开放格式(Parquet、ORC、JSON、Avro)落到对象存储(S3、ADLS、GCS、OSS),计算与存储解耦,成本大幅下降。但代价随之而来:缺少事务与并发控制,容易出现读到写一半的文件;缺少 Schema 约束,容易退化成“数据沼泽”;小文件多、元数据管理弱,查询性能不稳定;ACID、时间旅行、行级更新等能力缺失。

于是企业普遍形成“两套系统”的现实:数据湖存原始数据,数据仓库做分析。数据在两者之间反复搬运,产生冗余副本、口径不一致、时效延迟和治理割裂。Lakehouse 的驱动力就是用一套开放存储 + 一层事务化表格式 + 统一计算引擎,同时提供数据湖的低成本与数据仓库的可靠性。

二、Lakehouse 的核心特征

Lakehouse 不是“数据湖加一个查询引擎”,其关键差异在于在对象存储之上引入开放表格式(Delta Lake、Apache Iceberg、Apache Hudi)。以 Delta Lake 为例,它在 Parquet 数据文件旁维护一份事务日志 _delta_log,记录每次提交的元数据与文件增删,从而带来:

  • ACID 事务:并发写入通过乐观并发控制与冲突检测保证一致性,读者不会看到半成品数据。
  • Schema 演进与约束:支持加列、改类型(受控),并可对关键列施加 NOT NULL、CHECK 约束。
  • 时间旅行:按版本号或时间戳查询历史快照,便于审计、回溯与复现实验。
  • 批流一体:同一张表既可作为流式写入目标(含 MERGE、UPSERT),也可被批查询读取。
  • 开放格式:底层仍是 Parquet,可被 Spark、Presto/Trino、Flink 等多引擎读取,避免厂商锁定。

这些能力使 Lakehouse 能同时承载 BI 报表、机器学习特征、实时分析与数据科学探索,而不必为每种负载复制一份数据。

三、Databricks 平台的定位

Databricks 是 Lakehouse 架构的典型实现平台,其定位可以概括为:以 Delta Lake 为存储层、以 Spark 与 Photon 为计算层、以 Unity Catalog 为治理层、以 Lakehouse 上的多工作负载为价值层。它把数据工程、SQL 分析、机器学习、实时流处理统一在同一份数据上,并通过 Unity Catalog 提供跨工作区的统一权限、血缘与审计。

从选型角度看,若企业已有大量结构化报表且数据量不大,传统数仓仍可胜任;若数据种类多、增长快、需要 ML 与实时能力,且希望避免湖仓双份存储,Lakehouse 更合适。Databricks 的适用场景通常包括:多源异构数据入湖、增量 ETL/ELT、特征工程与模型训练、实时风控与推荐、以及需要统一治理的跨部门数据共享。

三代数据平台架构对比与 Databricks 分层定位 数据仓库 BI / 报表 / 固定 Schema 计算与存储耦合 结构化数据为主 代价:扩容贵、半结构化弱 数据湖 对象存储 + 开放格式 存算解耦、成本低 任意格式原始数据 代价:无事务、易成沼泽 Lakehouse 开放表格式 + ACID 批流一体、时间旅行 BI + ML + 实时统一 收益:一份数据多负载 演进 演进 Databricks 在 Lakehouse 中的分层定位 价值层 BI 报表 · 数据科学 · 特征工程 · 模型训练 · 实时风控与推荐 治理层 Unity Catalog:统一权限、血缘、审计、跨工作区共享 计算层 Spark / Photon / SQL Warehouse / Structured Streaming 存储层 对象存储(S3 / ADLS / GCS / OSS)+ Delta Lake 事务日志 _delta_log

四、一个可对照的示例:从双系统到 Lakehouse

假设某零售企业每天产生约 2 亿条订单与行为日志,原有架构是:日志经 Kafka 落到 S3 数据湖(Parquet),再用 Spark 每日批处理写入数仓做报表。痛点是:报表 T+1、无法做实时推荐、特征与报表口径不一致、湖中数据无人治理。

迁移到 Lakehouse 后,典型做法是:Kafka 通过 Structured Streaming 直接写入 Delta 表 fact_orders,使用 MERGE INTO 做 UPSERT;同一张表既供 SQL Warehouse 出报表,也供特征工程读取。示例参数(合理假设):

-- 建表:启用 Schema 约束与变更追踪
CREATE TABLE IF NOT EXISTS lakehouse.fact_orders (
  order_id   STRING NOT NULL,
  user_id    STRING,
  amount     DECIMAL(12,2),
  status     STRING,
  event_time TIMESTAMP
)
USING DELTA
TBLPROPERTIES ('delta.enableChangeDataFeed' = 'true');

-- 流式 UPSERT
MERGE INTO lakehouse.fact_orders AS t
USING staging_orders AS s
ON t.order_id = s.order_id
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *;

判断迁移是否达成目标,可观察几个可验证信号:报表时效从 T+1 缩短到分钟级;同一 order_id 在报表与特征表中的金额一致;通过 DESCRIBE HISTORY lakehouse.fact_orders 能看到每次写入版本,必要时用 VERSION AS OF 回溯到出问题前的快照;Unity Catalog 中能看到该表的上下游血缘。若这些信号成立,说明 Lakehouse 的核心收益已经落地,而不仅是换了一个存储格式。

选型提示:Lakehouse 并非在所有场景都优于数仓。若数据量小、负载单一、团队缺乏 Spark 与对象存储运维经验,传统数仓或托管数仓可能更省心。Lakehouse 的价值在“多负载、多格式、要治理、要实时”同时出现时才最明显。
常见误区:把“数据湖 + 一个 SQL 引擎”当作 Lakehouse。没有事务日志与 Schema 约束的湖,仍然会出现读到半成品、口径漂移、无法回溯的问题;Lakehouse 的关键在于表格式层,而不只是查询层。