1. 数据湖概述:从定义到Lakehouse架构

大家好,我是老张。做数据架构十几年了,今天咱们聊聊数据湖。

说实话,数据湖这个概念刚出来的时候,我也挺懵的。什么湖啊仓啊的,听着像搞水利的。但干久了你就发现,名字虽然花哨,背后解决的问题其实很实在。

1.1 数据湖到底是个啥?

数据湖,说白了就是一个集中存储海量原始数据的系统。你可以把各种格式的数据——结构化的、半结构化的、非结构化的——全都往里扔。

我习惯这么定义:数据湖是一个以原始格式存储数据的中央存储库,支持任意规模的数据,并且可以按需进行处理和分析。

嗯,这里要注意几个关键词:

  • 原始格式:数据进来什么样,存进去就什么样。不像数据仓库,得先做ETL清洗转换。
  • 任意规模:从几GB到几百PB,都能撑得住。
  • 按需处理:用的时候再定义schema,这叫"读时模式"(Schema-on-Read)。
我的经验: 刚接触数据湖的团队,最容易犯的错就是把它当垃圾桶。啥都往里倒,结果数据湖变成了"数据沼泽"。我在一个金融客户那见过,半年没管,湖里堆了200多TB没人知道是啥的数据。后来光清理就花了三周。

1.2 数据湖 vs 数据仓库:别搞混了

很多新人问我:数据湖和数据仓库到底啥区别?

我一般这么解释:数据仓库是"先想好再存",数据湖是"先存了再说"。

你想想看,传统数据仓库建表之前,得先设计好维度、度量、星型模型。数据湖呢?文件往里一丢,后面想怎么用都行。

下面这张表,是我在项目里经常给业务方看的对比:

对比维度 数据仓库 数据湖
数据格式 结构化,经过清洗转换 原始格式,包括JSON、CSV、Parquet、图片、日志等
Schema模式 写时模式(Schema-on-Write) 读时模式(Schema-on-Read)
处理方式 ETL(抽取-转换-加载) ELT(抽取-加载-转换)
主要用户 业务分析师、报表用户 数据科学家、数据工程师
存储成本 较高(需要高性能存储) 较低(通常用廉价对象存储)
数据质量 高(经过严格治理) 参差不齐(需要后期治理)
典型场景 固定报表、BI分析 探索性分析、机器学习、实时流处理

我曾经在一个电商项目里,两边都用了。订单交易数据走仓库,因为要出财务报表,一分钱都不能差。用户行为日志、点击流数据走数据湖,因为数据量大、格式乱,而且分析需求天天变。

避坑指南: 别以为数据湖能替代数据仓库。它们不是替代关系,是互补关系。我见过最惨的案例,是某公司把所有数据都扔进湖里,然后让业务部门直接查原始日志。结果一个简单的"上个月销售额是多少"的查询,跑了40分钟还没出结果。为啥?因为没做聚合,没建索引,数据湖不适合高频低延迟的查询。

1.3 数据湖的典型架构

数据湖架构这些年也进化了不少。我把它分成三个阶段来讲:

第一阶段:原始数据湖(2010年左右)

那时候的架构很简单:

  • 存储层:HDFS或S3
  • 计算层:MapReduce或Spark
  • 元数据层:Hive Metastore

问题也很明显:数据质量没人管,数据血缘一团糟,查个数据来源得问三个人。

第二阶段:带治理的数据湖(2015年左右)

大家发现光存不行,得管。于是加了:

  • 数据目录(如Apache Atlas、AWS Glue)
  • 数据质量框架(如Apache Griffin、Deequ)
  • 访问控制(如Ranger、Sentry)

这个阶段,数据湖开始"像样"了。但还有个硬伤:不支持事务。你想想,两个任务同时写同一个分区,数据就乱了。

第三阶段:Lakehouse架构(2020年至今)

Lakehouse,就是数据湖+数据仓库的合体。它解决了数据湖最头疼的几个问题:

  • ACID事务:支持原子性、一致性、隔离性、持久性
  • Schema演进:表结构可以平滑变更
  • 高效更新:支持upsert、merge操作
  • 数据版本控制:可以回滚到任意历史版本

实现Lakehouse的核心技术,就是开放表格式。目前主流的有三个:

技术 创始公司 核心特点 适用场景
Delta Lake Databricks 事务日志、时间旅行、Schema强制 Spark生态、批流一体
Apache Iceberg Netflix 隐藏分区、分区演进、多引擎支持 跨引擎场景(Spark、Flink、Trino)
Apache Hudi Uber 增量处理、记录级别索引、近实时写入 CDC场景、实时数仓

我个人习惯用Delta Lake。为啥?因为它在Spark生态里集成得最好,而且事务日志的设计很优雅。但如果你需要跨引擎查询,Iceberg可能更合适。

下面这张图,是我在给团队培训时画的Lakehouse架构:

Lakehouse 典型架构 数据源层 结构化数据(RDBMS) 半结构化(JSON/XML) 非结构化(日志/图片) 实时流(Kafka) 存储层(对象存储 / HDFS) Parquet / ORC / Avro 文件 + 开放表格式(Delta / Iceberg / Hudi) 计算引擎层 Spark Flink Trino / Presto Hive / MR 数据治理与质量层 数据目录 & 血缘 质量监控 & 校验 访问控制 & 审计 元数据管理 应用层:BI报表 / 机器学习 / 实时分析 / 数据产品

这个架构图,我建议你保存下来。后面讲数据质量监控的时候,你会反复看到它。

核心观点: Lakehouse不是银弹。它解决了数据湖的事务和治理问题,但数据质量不会自动变好。你仍然需要一套完整的监控体系来保证湖里的数据是可信的。这就是咱们这门课要讲的核心。

1.4 数据湖质量监控为什么难?

聊完架构,咱们说说痛点。数据湖的质量监控,比数据仓库难在哪?

我总结了几点:

  1. 数据格式杂:Parquet、Avro、JSON、CSV、甚至图片二进制流。每种格式的校验方式都不一样。
  2. Schema变化快:业务一改,字段就加。没有仓库那么严格的变更管控。
  3. 数据量大:动不动几百TB,全量校验不现实。
  4. 血缘关系乱:数据从哪来、经过哪些转换、被谁用过,经常说不清楚。
  5. 缺少事务保障:虽然Lakehouse加了ACID,但很多老的数据湖还在用原始方式,脏数据问题频发。

我曾经在一个项目里,因为数据湖里一个分区被重复写入,导致下游的报表连续三天数据对不上。排查了整整两天,才发现是调度系统配置错了。从那以后,我就在每个数据湖项目里强制加上了数据质量监控这个环节。

我的建议: 数据湖的质量监控,要从"事后补救"转向"事前预防"。别等数据出问题了再查,要在数据进入湖的那一刻就开始校验。后面几章,我会详细讲怎么做。