数据湖与数据仓库:数据湖架构设计、数据仓库分层模型、湖仓一体实践

这一章,我们来聊聊数据湖和数据仓库。说实话,这两个概念在业界吵了很多年。有人觉得数据湖就是个“垃圾场”,也有人认为数据仓库太死板。我的看法是——没有银弹,只有合适的场景。

我在2018年帮一家电商公司搭数据平台时,就踩过这个坑。一开始他们想用纯数据湖,结果业务方抱怨“查个订单明细要等半小时”。后来改成纯数仓,数据科学家又说“我想用的特征字段你们都没建模”。最后怎么解决的?嗯,就是现在大家常说的——湖仓一体。

数据湖架构设计

数据湖的核心思想很简单:存原始数据,等需要时再处理。跟数据仓库的“先建模再存储”正好相反。

数据湖 vs 数据仓库 核心差异

维度数据湖数据仓库
数据格式原始格式(CSV、JSON、Parquet、Avro)结构化、预建模
Schema读时模式(Schema-on-Read)写时模式(Schema-on-Write)
主要用户数据科学家、数据工程师BI分析师、业务报表
存储成本低(对象存储为主)较高(需要计算资源)
数据质量参差不齐高(经过ETL清洗)

我个人习惯把数据湖架构分成三层:

  1. 存储层:通常用对象存储(S3、OSS、HDFS),存原始文件。我建议按/raw/{数据源}/{日期}/{文件}这种结构组织,别一股脑全扔一个目录。
  2. 计算层:Spark、Flink、Presto这些引擎。它们直接读存储层的数据,做ETL或即席查询。
  3. 元数据层:这是最容易忽略的。没有元数据管理,数据湖真的会变成“数据沼泽”。我推荐用Apache Hive Metastore或AWS Glue Catalog。

这里有个避坑指南——千万别让业务方直接查原始数据湖。我曾经见过一个团队,把几十TB的原始日志直接开放给分析师查询,结果一个SQL跑了两个小时,还把集群搞挂了。后来我们加了数据采样和缓存层,才解决问题。

数据仓库分层模型

数据仓库的分层模型,说白了就是把数据从“脏乱差”一步步变成“干净整齐”的过程。业界最经典的是三层架构:ODS、DWD、DWS。

我的分层建议:不要死磕“必须三层”。我见过一些团队硬套五层模型,结果每层都在做重复的清洗工作。根据业务复杂度,2~4层都合理。

来,我们看一个具体的分层设计:

层级全称做什么数据粒度
ODS操作数据存储原样接入业务库、日志、消息队列与源系统一致
DWD数据明细层清洗、去重、维度退化、标准化业务明细粒度
DWS数据汇总层按主题聚合(日、周、月)轻度汇总
ADS应用数据层面向具体报表或应用高度汇总

你想想看,为什么需要这么多层?直接查ODS不行吗?

行,但代价很大。ODS里的数据可能有重复、有空值、有格式不一致。比如同一个用户ID,在订单表里是user_12345,在日志表里是12345。如果不做DWD层的标准化,后面所有分析都会出问题。

我在项目中遇到过最典型的一个案例:某金融公司做用户流失分析,ODS层直接关联了交易表和用户表,结果因为用户ID格式不统一,关联出来只有60%的匹配率。后来我们在DWD层做了ID映射,匹配率提升到99.5%。

湖仓一体实践

湖仓一体(Lakehouse)这个概念,其实是想同时拥有数据湖的灵活性和数据仓库的可靠性。说白了,就是“我全都要”。

它的核心思路是:用数据湖的存储(低成本、开放格式),加上数据仓库的元数据管理和事务能力。

注意:湖仓一体不是简单的“数据湖+数据仓库”。如果你只是把数据湖的数据ETL到数仓,那叫“数据管道”,不叫湖仓一体。真正的湖仓一体,是在同一份数据上同时支持BI查询和机器学习训练。

目前主流的湖仓一体方案有:

  • Delta Lake(Databricks):支持ACID事务、时间旅行、Schema演进。我最早用Delta Lake时,最惊艳的是它能做MERGE操作——这在传统数据湖里几乎不可能。
  • Apache Iceberg:开源、高性能、支持隐藏分区。它的分区裁剪做得特别好,查询效率比Hive表高一个数量级。
  • Apache Hudi:擅长增量处理,适合CDC场景。如果你有大量实时写入需求,Hudi的upsert能力很香。

下面这张图是我自己总结的湖仓一体架构:

湖仓一体架构图 统一存储层(S3 / OSS / HDFS) Parquet + ORC + Avro 开放格式 湖仓引擎层 Delta Lake / Iceberg / Hudi ACID事务 · 时间旅行 · Schema演进 计算引擎层 Spark SQL · Presto · Flink · Hive 批处理 · 流处理 · 即席查询 应用层:BI报表 · 数据科学 · 实时推荐 同一份数据 多种计算引擎共享

在实际落地时,我建议你从增量场景开始。别一上来就想把整个数仓迁移到湖仓一体架构上。我在一家物流公司就是这么做的——先选了一个实时轨迹表,用Hudi做增量写入,跑通后再逐步扩展。三个月后,整个ODS层都跑在湖仓一体上了。

我的经验:湖仓一体的元数据管理是关键。不管你用Delta Lake还是Iceberg,一定要把元数据服务搭好。我见过一个团队,数据湖里存了200TB数据,但没人知道哪些表是干净的、哪些是测试数据。后来我们加了数据血缘追踪,才把这个问题解决。

最后说一句:技术选型没有标准答案。如果你的团队以BI报表为主,数据仓库可能更合适。如果你们有大量数据科学和机器学习需求,数据湖或湖仓一体会是更好的选择。关键是——想清楚你的数据消费者是谁,他们需要什么。