数据湖仓概述:从数据仓库到湖仓一体
大家好,我是这次课程的主讲。今天咱们聊聊数据湖仓的来龙去脉。
说实话,我在这个领域摸爬滚打了十几年。从最早的数据仓库,到后来的数据湖,再到现在的湖仓一体,每一步都踩过坑。今天就把这些经验掰开揉碎了讲给你听。
数据仓库的黄金时代与局限
数据仓库这个概念,诞生于上世纪90年代。那时候,企业数据量不大,结构也很规整。你想想看,无非就是订单表、客户表、产品表这些。
数据仓库的核心思想很简单:ETL清洗,建模存储,报表查询。它解决了"数据孤岛"的问题,让企业能统一看数据。
数据仓库的典型架构:
- ODS层:原始数据暂存
- DWD层:明细数据,按主题组织
- DWS层:轻度汇总
- ADS层:应用层,直接给报表用
但问题也来了。我在2015年做过一个零售项目,业务部门想分析用户评论里的情感倾向。数据仓库里只有结构化数据,评论这种半结构化文本根本存不进去。最后只能单独搭一套Hadoop集群,数据来回倒腾,麻烦得要命。
数据仓库的硬伤很明显:
- 只能处理结构化数据——日志、图片、音频这些,它搞不定
- 扩展成本高——MPP架构的扩展,说白了就是砸钱买硬件
- 数据加载慢——全量加载一次,大表可能要跑几个小时
数据湖的崛起与阵痛
2010年左右,Hadoop火了。数据湖的概念应运而生。它的口号是"存原始数据,想怎么用就怎么用"。
数据湖确实解决了数据仓库的痛点:
- 能存任何格式的数据——CSV、JSON、Parquet、图片、视频,来者不拒
- 存储成本低——普通服务器就能搭集群
- 计算灵活——Spark、Flink、Presto,想用什么引擎都行
但是,数据湖也有自己的问题。我曾经接手过一个项目,数据湖里存了上百TB的数据,但没人知道哪些数据是干净的,哪些是垃圾。业务部门想用数据,得先花两周搞清楚数据质量。这就是典型的"数据沼泽"。
数据湖的三大痛点:
- 缺乏事务支持——并发读写容易出问题,数据一致性难保证
- 元数据管理弱——没有统一的Schema,数据血缘一团乱
- 查询性能差——没有索引和统计信息,跑个聚合查询慢得要死
湖仓一体:取长补短
所以,数据仓库和数据湖,就像两个有缺陷的恋人。数据仓库严谨但死板,数据湖灵活但混乱。能不能把它们结合起来?
湖仓一体(Lakehouse)就是答案。它的核心思想是:在数据湖的存储之上,构建数据仓库的治理能力。
说白了,就是既要数据湖的灵活性和低成本,又要数据仓库的事务支持和性能优化。
我个人理解的湖仓一体三要素:
- 存储层:基于对象存储或HDFS,存原始数据
- 表格式:Delta Lake、Apache Iceberg、Apache Hudi,提供ACID事务
- 计算引擎:Spark、Flink、Trino,跑各种分析任务
这里我画了一张图,帮你理解湖仓一体的整体架构:
增量处理的价值
好了,架构说完了。那增量处理在湖仓一体里扮演什么角色?
我举个例子。你有一个订单表,每天新增100万条记录。如果每次分析都全量扫描,数据量大了以后,跑一次要几个小时。业务部门等不了。
增量处理的核心价值就是:只处理变化的数据。
增量处理的三大优势:
| 维度 | 全量处理 | 增量处理 |
|---|---|---|
| 处理数据量 | 全部数据 | 仅变化数据 |
| 处理延迟 | 小时级 | 分钟级甚至秒级 |
| 资源消耗 | 高 | 低 |
| 适用场景 | 历史全量回溯 | 实时/准实时分析 |
我曾经帮一家电商公司做数据管道优化。他们原来每天凌晨跑全量ETL,要跑4个小时。改成增量处理后,每5分钟同步一次,延迟从4小时降到5分钟,服务器资源消耗降低了70%。
增量处理的挑战
但是,增量处理不是银弹。它有自己的坑。
增量处理的四大挑战:
- 数据一致性——增量数据可能乱序到达,怎么保证最终一致?
- 去重问题——同一条数据可能被多次捕获,怎么去重?
- Schema变更——源表加了字段,增量管道怎么自动适配?
- 回溯能力——增量管道出错了,怎么重新处理历史数据?
嗯,这里要注意。很多团队刚开始做增量处理时,只关注了"快",忽略了"准"。结果数据对不上,业务部门天天投诉。
我个人习惯的做法是:先保证数据一致性,再优化性能。具体怎么保证?后面几章我会详细讲。
湖仓一体中的增量处理模式
在湖仓一体架构下,增量处理主要有三种模式:
- CDC(Change Data Capture)——从数据库日志里捕获变更,实时同步到湖仓
- 流式写入——用Flink或Spark Streaming,把实时数据流写入表格式
- 增量批处理——定时扫描源表,只处理新增或修改的分区
这三种模式各有适用场景。我建议你根据业务需求来选择:
| 模式 | 延迟 | 适用场景 | 典型工具 |
|---|---|---|---|
| CDC | 秒级 | 数据库实时同步 | Debezium + Kafka |
| 流式写入 | 秒级~分钟级 | 日志、IoT数据 | Flink + Delta Lake |
| 增量批处理 | 分钟级~小时级 | 离线数仓增量更新 | Spark + Iceberg |
我的建议:
刚开始做增量处理时,别追求极致实时。先做到分钟级增量,稳定运行后再优化到秒级。我曾经见过一个团队,一上来就要做实时,结果数据乱序、重复、丢失,折腾了三个月才稳定下来。
本章小结
好了,这一章的内容就这些。我们回顾一下:
- 数据仓库解决了结构化数据的统一分析问题,但扩展性差、不支持非结构化数据
- 数据湖解决了存储灵活性和成本问题,但缺乏事务和治理能力
- 湖仓一体在数据湖存储上构建数据仓库能力,是当前的最佳实践
- 增量处理能大幅降低延迟和资源消耗,但要注意数据一致性和去重问题