数据湖仓概述:从数据仓库到湖仓一体

大家好,我是这次课程的主讲。今天咱们聊聊数据湖仓的来龙去脉。

说实话,我在这个领域摸爬滚打了十几年。从最早的数据仓库,到后来的数据湖,再到现在的湖仓一体,每一步都踩过坑。今天就把这些经验掰开揉碎了讲给你听。

数据仓库的黄金时代与局限

数据仓库这个概念,诞生于上世纪90年代。那时候,企业数据量不大,结构也很规整。你想想看,无非就是订单表、客户表、产品表这些。

数据仓库的核心思想很简单:ETL清洗,建模存储,报表查询。它解决了"数据孤岛"的问题,让企业能统一看数据。

数据仓库的典型架构:

  • ODS层:原始数据暂存
  • DWD层:明细数据,按主题组织
  • DWS层:轻度汇总
  • ADS层:应用层,直接给报表用

但问题也来了。我在2015年做过一个零售项目,业务部门想分析用户评论里的情感倾向。数据仓库里只有结构化数据,评论这种半结构化文本根本存不进去。最后只能单独搭一套Hadoop集群,数据来回倒腾,麻烦得要命。

数据仓库的硬伤很明显:

  • 只能处理结构化数据——日志、图片、音频这些,它搞不定
  • 扩展成本高——MPP架构的扩展,说白了就是砸钱买硬件
  • 数据加载慢——全量加载一次,大表可能要跑几个小时

数据湖的崛起与阵痛

2010年左右,Hadoop火了。数据湖的概念应运而生。它的口号是"存原始数据,想怎么用就怎么用"。

数据湖确实解决了数据仓库的痛点:

  • 能存任何格式的数据——CSV、JSON、Parquet、图片、视频,来者不拒
  • 存储成本低——普通服务器就能搭集群
  • 计算灵活——Spark、Flink、Presto,想用什么引擎都行

但是,数据湖也有自己的问题。我曾经接手过一个项目,数据湖里存了上百TB的数据,但没人知道哪些数据是干净的,哪些是垃圾。业务部门想用数据,得先花两周搞清楚数据质量。这就是典型的"数据沼泽"。

数据湖的三大痛点:

  1. 缺乏事务支持——并发读写容易出问题,数据一致性难保证
  2. 元数据管理弱——没有统一的Schema,数据血缘一团乱
  3. 查询性能差——没有索引和统计信息,跑个聚合查询慢得要死

湖仓一体:取长补短

所以,数据仓库和数据湖,就像两个有缺陷的恋人。数据仓库严谨但死板,数据湖灵活但混乱。能不能把它们结合起来?

湖仓一体(Lakehouse)就是答案。它的核心思想是:在数据湖的存储之上,构建数据仓库的治理能力。

说白了,就是既要数据湖的灵活性和低成本,又要数据仓库的事务支持和性能优化。

我个人理解的湖仓一体三要素:

  • 存储层:基于对象存储或HDFS,存原始数据
  • 表格式:Delta Lake、Apache Iceberg、Apache Hudi,提供ACID事务
  • 计算引擎:Spark、Flink、Trino,跑各种分析任务

这里我画了一张图,帮你理解湖仓一体的整体架构:

湖仓一体核心架构 存储层(数据湖) 对象存储 / HDFS / 云存储 Parquet / ORC / Avro 格式 表格式层(ACID事务) Delta Lake / Apache Iceberg / Apache Hudi 事务支持 · Schema演进 · 时间旅行 计算引擎层 Apache Spark / Apache Flink / Trino / Presto 批处理 · 流处理 · 交互式查询 💡 核心思想: 在数据湖的廉价存储上,通过表格式层提供数据仓库的事务和治理能力, 上层计算引擎统一处理批、流、交互式查询。

增量处理的价值

好了,架构说完了。那增量处理在湖仓一体里扮演什么角色?

我举个例子。你有一个订单表,每天新增100万条记录。如果每次分析都全量扫描,数据量大了以后,跑一次要几个小时。业务部门等不了。

增量处理的核心价值就是:只处理变化的数据。

增量处理的三大优势:

维度 全量处理 增量处理
处理数据量 全部数据 仅变化数据
处理延迟 小时级 分钟级甚至秒级
资源消耗 高 低
适用场景 历史全量回溯 实时/准实时分析

我曾经帮一家电商公司做数据管道优化。他们原来每天凌晨跑全量ETL,要跑4个小时。改成增量处理后,每5分钟同步一次,延迟从4小时降到5分钟,服务器资源消耗降低了70%。

增量处理的挑战

但是,增量处理不是银弹。它有自己的坑。

增量处理的四大挑战:

  1. 数据一致性——增量数据可能乱序到达,怎么保证最终一致?
  2. 去重问题——同一条数据可能被多次捕获,怎么去重?
  3. Schema变更——源表加了字段,增量管道怎么自动适配?
  4. 回溯能力——增量管道出错了,怎么重新处理历史数据?

嗯,这里要注意。很多团队刚开始做增量处理时,只关注了"快",忽略了"准"。结果数据对不上,业务部门天天投诉。

我个人习惯的做法是:先保证数据一致性,再优化性能。具体怎么保证?后面几章我会详细讲。

湖仓一体中的增量处理模式

在湖仓一体架构下,增量处理主要有三种模式:

  • CDC(Change Data Capture)——从数据库日志里捕获变更,实时同步到湖仓
  • 流式写入——用Flink或Spark Streaming,把实时数据流写入表格式
  • 增量批处理——定时扫描源表,只处理新增或修改的分区

这三种模式各有适用场景。我建议你根据业务需求来选择:

模式 延迟 适用场景 典型工具
CDC 秒级 数据库实时同步 Debezium + Kafka
流式写入 秒级~分钟级 日志、IoT数据 Flink + Delta Lake
增量批处理 分钟级~小时级 离线数仓增量更新 Spark + Iceberg

我的建议:

刚开始做增量处理时,别追求极致实时。先做到分钟级增量,稳定运行后再优化到秒级。我曾经见过一个团队,一上来就要做实时,结果数据乱序、重复、丢失,折腾了三个月才稳定下来。

本章小结

好了,这一章的内容就这些。我们回顾一下:

  • 数据仓库解决了结构化数据的统一分析问题,但扩展性差、不支持非结构化数据
  • 数据湖解决了存储灵活性和成本问题,但缺乏事务和治理能力
  • 湖仓一体在数据湖存储上构建数据仓库能力,是当前的最佳实践
  • 增量处理能大幅降低延迟和资源消耗,但要注意数据一致性和去重问题