1. 湖仓一体概述:数据仓库与数据湖的演进、湖仓一体架构定义、Lambda与Kappa架构对比
1.1 数据仓库的诞生与局限
数据仓库这个概念,最早是 Bill Inmon 在 90 年代提出的。说白了,就是想把企业里散落各处的业务数据,统一存到一个地方,方便做报表和分析。
我刚开始做数据时,接触的就是传统数仓。那时候的架构很清晰:ETL 抽取、清洗、转换,然后加载到关系型数据库里。数据是结构化的,Schema 是提前定好的。你想想看,这种模式在业务稳定、数据量不大的时候,确实好用。
但问题很快就来了。我记得有一次,业务部门突然要接入一批日志数据,格式乱七八糟,字段每天都在变。传统数仓的 Schema-on-Write 模式,根本扛不住。改一次表结构,要审批、要重建、要重新跑数据,折腾好几天。
1.2 数据湖的兴起与痛点
数据湖的出现,就是为了解决数仓的「僵化」问题。它提倡 Schema-on-Read,数据先存进来,用的时候再解析。Hadoop 生态的 HDFS、Hive、Spark 就是典型代表。
数据湖的好处很明显:
- 能存任何格式的数据——结构化、半结构化、非结构化
- 存储成本低,用廉价硬件就能搞定
- 支持灵活的数据探索,不用提前建模
但用久了你会发现,数据湖也有自己的坑。我见过太多团队,数据湖最后变成了「数据沼泽」——数据往里一丢,没人管、没人理,质量一塌糊涂。
为什么会这样?因为没有事务支持,没有强一致性,没有 Schema 约束。你往湖里写数据,可能写到一半就失败了,留下一堆脏数据。你想更新一条记录?对不起,数据湖不支持 ACID。
1.3 湖仓一体架构的定义
湖仓一体(Lakehouse),就是在这个背景下诞生的。它把数据仓库的 ACID 事务、Schema 约束、数据治理能力,嫁接到了数据湖的低成本存储上。
我个人习惯把湖仓一体理解为:用数据湖的存储底座,跑数据仓库的活。
它的核心特征包括:
- 事务支持:支持 ACID,保证并发读写的一致性
- Schema 治理:支持 Schema 演进,但不允许随意破坏结构
- 开放存储格式:基于 Parquet、ORC、Avro 等开放格式,避免厂商锁定
- 多种负载:同一份数据,既能跑 BI 报表,也能跑机器学习
- 数据版本控制:支持时间旅行(Time Travel),可以回溯历史数据
目前主流的湖仓一体技术,包括 Apache Iceberg、Delta Lake、Apache Hudi。这三者各有侧重,但核心思路是一致的。
1.4 Lambda 与 Kappa 架构对比
聊湖仓一体,绕不开 Lambda 和 Kappa 这两个架构模式。它们解决的是同一个问题:如何同时处理实时数据和批量数据。
Lambda 架构
Lambda 架构把数据处理分成两条路:
- 批处理层(Batch Layer):处理全量历史数据,保证数据准确
- 流处理层(Speed Layer):处理实时增量数据,保证低延迟
- 服务层(Serving Layer):合并批和流的结果,对外提供服务
听起来很合理对吧?但实际用起来,维护成本很高。你想想看,同一套业务逻辑,要在批处理和流处理里各写一遍。万一逻辑不一致,结果就对不上。
我记得有一次,批处理层和流处理层的聚合逻辑差了一个字段,导致报表数据对不上。排查了整整两天,最后发现是代码没同步。嗯,这种问题在 Lambda 架构里太常见了。
Kappa 架构
Kappa 架构的思路更激进:只用一套流处理引擎,搞定所有数据。历史数据也当作流来处理,通过重放(Replay)的方式,把数据从 Kafka 等消息队列里重新消费一遍。
Kappa 的好处很明显:
- 架构简单,只有一条处理链路
- 逻辑统一,不会出现批流不一致
- 运维成本低,只需要维护一套系统
但它的局限也很突出:流处理引擎的容错和状态管理,在处理海量历史数据时,性能往往不如批处理。说白了,Kappa 更适合数据量可控、实时性要求高的场景。
| 对比维度 | Lambda 架构 | Kappa 架构 |
|---|---|---|
| 处理链路 | 批处理 + 流处理,两条链路 | 仅流处理,一条链路 |
| 逻辑一致性 | 容易产生批流不一致 | 天然一致 |
| 运维复杂度 | 高,需要维护两套系统 | 低,一套系统搞定 |
| 历史数据重算 | 批处理层直接重算 | 通过流重放,性能受限 |
| 适用场景 | 数据量大、对准确性要求极高 | 实时性优先、数据量可控 |
1.5 湖仓一体与架构演进的关系
湖仓一体的出现,其实是对 Lambda 和 Kappa 架构的一种「融合升级」。它用统一的存储层,同时支撑批处理和流处理,避免了数据在多个系统间来回拷贝的问题。
我个人认为,未来的趋势是:湖仓一体 + 流批一体。底层用 Lakehouse 统一存储,上层用 Flink、Spark Streaming 等引擎统一计算。这样既保留了 Lambda 架构的灵活性,又降低了 Kappa 架构的运维成本。
下面这张图,展示了湖仓一体在数据架构中的核心位置:
从这张图你可以看到,湖仓一体并不是要取代数据仓库或数据湖,而是把它们的长处融合在一起。数据源进来后,统一落到湖仓一体存储层,然后根据业务需求,选择不同的计算引擎去处理。
嗯,这里要注意一点:湖仓一体不是银弹。如果你的场景就是纯 BI 报表,传统数仓可能更合适。如果你的场景是纯数据探索,数据湖也够用。湖仓一体的价值,在于「既要又要」的场景——既要低成本存储,又要高数据质量。