2、Lakehouse核心概念:什么是Lakehouse,核心特性与传统架构对比
好,咱们直接进入正题。上一章聊了数据架构的演进脉络,这一章我们聚焦在 Lakehouse 本身。很多朋友问我:「Lakehouse 不就是数据湖上加了个事务吗?」嗯,这么说对了一半,但真正的精髓远不止于此。
我个人习惯把 Lakehouse 理解为「数据湖的骨架 + 数据仓库的灵魂」。它既保留了数据湖的廉价存储和 Schema-on-Read 灵活性,又引入了数据仓库的 ACID 事务、SQL 支持和 BI 工具对接能力。说白了,就是让你在对象存储上,也能跑出数据仓库的体验。
2.1 什么是 Lakehouse?
先给一个简洁的定义:Lakehouse 是一种新型数据架构,它在低成本的对象存储(如 S3、ADLS、OSS)之上,直接构建了事务层、元数据层和 SQL 引擎,使得同一份数据既能跑机器学习,又能做 BI 报表,还能支持实时流处理。
我在项目中遇到过不少团队,数据湖里存了几百 TB 的 Parquet 文件,但一到月底出报表就头疼——因为数据不一致、重复、缺少更新能力。后来迁移到 Lakehouse 架构,最直观的感受是:终于不用在数据湖和数仓之间来回倒腾数据了。
核心洞察: Lakehouse 不是推翻数据湖,而是给数据湖「装上引擎」。存储还是那个存储,但数据的管理方式从「文件级」升级到了「表级」。
2.2 核心特性拆解
Lakehouse 的特性很多,但最关键的三个,我一个个说。
2.2.1 ACID 事务
这是 Lakehouse 区别于传统数据湖最根本的一点。传统数据湖里,如果你同时跑两个作业写同一个 Parquet 文件,大概率会出问题——要么数据覆盖,要么读到半成品。
Lakehouse 通过事务日志(Transaction Log)来管理每一次数据变更。每个写操作都会先记录日志,再更新数据文件。读操作会从日志中获取当前表的「快照版本」,保证读到一致的数据。
-- 示例:Delta Lake 中的事务操作
-- 同时运行两个更新,不会互相干扰
UPDATE sales SET amount = amount * 1.1 WHERE region = '华东';
UPDATE sales SET amount = amount * 0.95 WHERE region = '华北';
-- 两个操作会串行化执行,保证最终一致性
避坑指南: 我曾经在项目中遇到过一个坑——事务日志文件过多导致性能下降。解决方案是定期执行 VACUUM 清理历史版本,同时设置合理的保留期(比如保留最近 7 天的版本)。
2.2.2 Schema-on-Read
这个特性其实是从数据湖继承来的,但 Lakehouse 做了增强。传统数据仓库是 Schema-on-Write——数据写入前必须定义好表结构,改起来很麻烦。Lakehouse 允许你先存数据,读的时候再定义结构。
但 Lakehouse 的 Schema-on-Read 不是「无政府状态」。它引入了 Schema Enforcement(模式强制)和 Schema Evolution(模式演进)。写入时,引擎会检查数据类型是否兼容;需要加列时,不用重建整个表。
-- 示例:Spark SQL 中动态添加列
ALTER TABLE user_behavior ADD COLUMNS (device_type STRING AFTER event_time);
-- 历史数据该列显示为 NULL,新数据正常写入
你想想看,这在传统数仓里得有多麻烦?先要 ALTER TABLE,然后要全量刷新历史分区,搞不好还要停服。在 Lakehouse 里,一行 SQL 搞定。
2.2.3 BI 支持
很多数据湖方案被业务部门吐槽:「你们的数据科学家用得挺欢,但我们做报表的连个 JDBC 连接都找不到。」Lakehouse 直接解决了这个问题。
主流 Lakehouse 引擎(如 Databricks SQL、Apache Spark Thrift Server、Trino)都提供了标准的 JDBC/ODBC 接口。Tableau、Power BI、Superset 这些工具可以直接连上来查数据,延迟通常在秒级。
关键点: BI 支持不是简单的「能连上就行」,而是要保证查询性能。Lakehouse 通过数据跳过索引(Data Skipping)、Z-Order 排序、物化视图等技术,让 Ad-hoc 查询也能跑得快。
2.3 与传统架构对比
光说概念不够直观,咱们直接上对比表。我整理了一份,涵盖了最常见的几个维度。
| 对比维度 | 传统数据仓库 | 传统数据湖 | Lakehouse |
|---|---|---|---|
| 存储成本 | 高(专用硬件) | 低(对象存储) | 低(对象存储) |
| 事务支持 | 完整 ACID | 无或有限 | 完整 ACID |
| Schema 模式 | Schema-on-Write | Schema-on-Read | 两者兼顾 |
| BI 工具对接 | 原生支持 | 困难 | 原生支持 |
| 机器学习支持 | 困难 | 原生支持 | 原生支持 |
| 实时流处理 | 有限 | 有限 | 原生支持 |
| 数据治理 | 强 | 弱 | 强 |
从这张表能看出来,Lakehouse 在「成本」和「能力」之间找到了一个平衡点。它没有数据仓库那么贵,也没有数据湖那么「野」。
2.4 Lakehouse 架构全景图
下面这张 SVG 图展示了 Lakehouse 的核心分层结构。我建议你仔细看看,因为后续所有章节都会围绕这个架构展开。
这个架构图里,我特别想强调一点:事务层和元数据层是 Lakehouse 的灵魂。没有它们,下面的存储层就是普通数据湖,上面的计算引擎层就是普通的 SQL 查询工具。正是这两层,把「文件」变成了「表」,把「读写」变成了「事务」。
2.5 什么时候该用 Lakehouse?
聊了这么多优点,我也得说点实在的。Lakehouse 不是银弹,它有自己的适用场景。
- 适合: 数据湖已经很大、但需要 ACID 保证的场景;需要同时服务数据科学和 BI 的团队;希望降低数据冗余和 ETL 成本的架构。
- 不太适合: 对查询延迟要求极低(毫秒级)的 OLTP 场景;数据量很小、用传统数据库就够的场景;团队完全没有 Spark 或 SQL 经验的场景。
注意: Lakehouse 的查询延迟通常在秒级到分钟级,不适合做在线交易系统。如果你需要支持高并发、低延迟的点查,还是老老实实用 OLTP 数据库。