一、数据湖是什么?

数据湖(Data Lake)是一个用于低成本存储海量原始数据,并支持后续分析、计算和加工的数据平台。

它可以保存:

结构化数据:MySQL、Oracle、订单表
半结构化数据:JSON、日志、CDC、消息
非结构化数据:图片、音频、视频、文档

常见底层存储包括:

HDFS
Amazon S3
阿里云 OSS
Azure Data Lake Storage
Google Cloud Storage

一句话理解:

数据湖先把各种数据以较原始的形式集中保存下来,再根据业务需要进行清洗、建模和分析。

它和传统数仓最大的区别是:数据湖通常先存储,后定义用途和结构;传统数仓则更强调先建模,再按模型写入数据


二、为什么需要数据湖?

传统数据仓库通常主要处理结构化数据,例如:

用户表
订单表
商品表
交易事实表

但现代企业还会产生大量其他数据:

App 日志
Web 访问日志
IoT 设备数据
Kafka 消息
MySQL Binlog
图片和视频
第三方 API 数据

如果所有数据都先转换成固定的数仓表结构,通常会遇到:

  • 开发周期较长;
  • 数据格式转换成本高;
  • 新需求响应慢;
  • 非结构化数据难以保存;
  • 原始数据丢失后难以重新处理。

数据湖可以先保留原始数据:

数据源
  ↓
原始数据入湖
  ↓
按需清洗和建模
  ↓
报表、机器学习、实时分析

这样,当业务规则变化时,可以重新从原始数据加工,而不必重新从数据源采集。


三、数据湖的典型架构

一个常见的数据湖架构如下:

业务数据库 / 日志 / Kafka / 文件 / API
                    ↓
              数据采集层
          Flink / Spark / CDC
                    ↓
              对象存储或 HDFS
                    ↓
          Bronze / Silver / Gold
                    ↓
      Spark / Flink / Trino / BI / ML

各层含义通常是:

1. Bronze:原始层

保存从数据源采集来的原始数据,尽量少做修改。

例如:

MySQL Binlog 原始事件
Web 访问日志
Kafka 消息
第三方接口返回的 JSON

特点:

  • 接近源数据;
  • 便于审计和回放;
  • 可能存在重复、脏数据和不完整字段;
  • 通常按照采集时间或事件时间存储。

2. Silver:明细清洗层

对原始数据进行清洗、去重、类型转换和关联处理。

常见处理包括:

字段类型统一
时间格式统一
处理空值
去除重复数据
解析 JSON
合并 CDC 变更
补充业务字段

例如把多个来源的订单数据统一成:

order_id
user_id
amount
status
event_time
update_time

3. Gold:汇总应用层

面向报表、指标和具体业务应用。

例如:

日销售额
用户活跃度
商品转化率
地区订单统计
客户生命周期指标

Gold 层的数据通常更接近数据仓库中的数据集市或宽表。

需要注意,Bronze、Silver、Gold 不是强制标准,而是一种常见的数据分层方法。不同公司也可能叫 ODS、DWD、DWS、ADS。


四、数据湖里存的是什么?

早期数据湖经常直接保存大量文件:

CSV
JSON
Avro
Parquet
ORC

其中:

  • CSV 和 JSON 便于交换,但查询效率通常较低;
  • Avro 更适合行式写入和消息传输;
  • Parquet 和 ORC 更适合分析查询。

对于大规模分析,通常会将清洗后的数据保存为列式格式:

Parquet / ORC

它们支持:

  • 列裁剪;
  • 谓词下推;
  • 压缩;
  • 统计信息;
  • 嵌套类型;
  • 按文件或数据块跳过无关数据。

但是要注意:

Parquet 和 ORC 只是文件格式,不等于完整的数据湖表。


五、文件格式和表格式的区别

这是理解数据湖最重要的概念之一。

文件格式

负责“数据如何写进一个文件”:

Parquet
ORC
Avro
CSV
JSON

例如 Parquet 负责:

  • 列式存储;
  • 编码;
  • 压缩;
  • 文件内统计信息。

表格式

负责“多个数据文件如何组成一张可靠的表”:

Apache Iceberg
Apache Hudi
Delta Lake

表格式通常提供:

  • 事务提交;
  • 快照;
  • Time Travel;
  • Schema Evolution;
  • Update、Delete、Merge;
  • 增量读取;
  • 文件清理;
  • 并发控制;
  • 表级元数据管理。

可以这样理解:

数据湖
├── 存储:S3 / OSS / HDFS
├── 文件格式:Parquet / ORC / Avro
├── 表格式:Iceberg / Hudi / Delta Lake
├── 计算引擎:Spark / Flink / Trino
└── Catalog:Hive Metastore / REST / Glue 等

例如:

Iceberg + Parquet
Hudi + Parquet
Delta Lake + Parquet

表格式是在普通数据文件之上增加表管理能力。


六、数据湖如何支持更新和删除?

对象存储中的 Parquet 文件通常是不可变的,不能像数据库一样直接修改某一行。

如果没有表格式,更新数据可能需要:

找到旧文件
  ↓
读取文件
  ↓
修改记录
  ↓
重写新文件
  ↓
替换旧文件

数据量较大时,这个过程成本很高。

Iceberg、Hudi、Delta Lake 会通过不同机制解决这个问题,例如:

重写受影响的数据文件
记录 Delete Files
写入增量日志
创建新的 Snapshot

查询时读取最新的表状态,维护任务再负责合并文件、清理旧版本和减少小文件。


七、数据湖的关键组件

1. 存储层

保存实际数据和元数据:

HDFS
S3
OSS
ADLS
GCS

对象存储通常具有容量大、成本低、扩展性强等特点。


2. 采集层

负责把数据导入数据湖:

Flink CDC
Debezium
Kafka Connect
Logstash
Sqoop
自定义采集程序

数据来源可以是:

MySQL
PostgreSQL
Oracle
Kafka
应用日志
文件系统
API

3. 计算层

负责清洗、转换、聚合和查询:

Spark
Flink
Trino
Presto
Hive
Snowflake

常见分工是:

Spark:批处理、复杂 ETL、大规模计算
Flink:流处理、实时计算、CDC
Trino:交互式 SQL 查询

实际部署中也可能由同一个引擎承担多种任务。


4. Catalog

Catalog 负责管理表名、表位置和表元数据。

例如查询:

SELECT * FROM lake.orders;

查询引擎需要通过 Catalog 知道:

orders 表在哪里
当前使用哪个 Snapshot
有哪些 Schema 和分区

常见方案包括:

Hive Metastore
AWS Glue Catalog
Iceberg REST Catalog
JDBC Catalog
Nessie

5. 数据治理层

数据湖规模扩大后,需要管理:

数据目录
血缘关系
数据质量
权限控制
脱敏
生命周期
审计

常见治理内容包括:

  • 谁可以读取哪些表;
  • 哪些字段包含个人信息;
  • 数据从哪里来、被谁使用;
  • 哪些数据可以删除;
  • 原始数据保留多长时间;
  • 表是否有重复、缺失或延迟数据。

八、数据湖和数据仓库的区别

对比项数据湖数据仓库
数据类型结构化、半结构化、非结构化主要是结构化数据
写入方式可先存储后建模通常先建模后写入
数据状态原始数据和加工数据都可保存通常保存清洗后的数据
存储成本通常较低通常较高
查询稳定性需要较好的治理和建模通常更稳定
使用人群工程师、分析师、算法团队分析师、报表用户、业务人员
主要用途数据探索、ETL、机器学习、实时处理报表、指标、经营分析
管理复杂度原始数据多,治理要求高模型较明确,管理相对集中

数据湖并不一定要取代数据仓库。

很多企业会采用:

数据湖保存明细和原始数据
        ↓
数据仓库或数据集市提供稳定指标

九、数据湖和数据湖仓的区别

数据湖早期更像:

把各种文件放进对象存储

但如果只有文件,没有事务、Schema 和治理,容易变成“数据沼泽”:文件很多,却没人知道数据是否可信。

数据湖仓(Lakehouse)是在数据湖基础上增加数仓能力:

开放低成本存储
+
事务和一致性
+
Schema 管理
+
可靠表格式
+
SQL 查询
+
数据治理

常见湖仓表格式:

Iceberg
Hudi
Delta Lake

可以简单区分:

数据湖:强调存储各种数据
数据仓库:强调结构化分析
数据湖仓:希望兼具两者能力

十、数据湖的优点

1. 存储成本低

对象存储适合保存海量数据,容量扩展简单。

2. 数据格式灵活

可以同时保存表格、日志、JSON、图片和音视频。

3. 保留原始数据

后续业务规则变化时,可以重新加工历史数据。

4. 支持多种计算引擎

同一批数据可以被 Spark、Flink、Trino 等不同引擎使用。

5. 适合机器学习和数据探索

算法团队可以使用较完整的原始特征和历史数据。

6. 容易接入流批一体架构

Kafka、Flink CDC 等产生的增量数据可以持续写入湖中。


十一、数据湖的常见问题

1. 数据沼泽

如果只负责把数据放进去,不定义标准和负责人,最终会出现:

表名混乱
字段含义不清
重复数据很多
没有质量监控
不知道哪些数据可信

2. 小文件问题

流式或频繁批量写入可能产生大量小文件,导致:

  • 查询打开文件次数增加;
  • 元数据压力变大;
  • 任务调度变慢;
  • 查询规划时间增加。

通常需要:

控制写入批次
调整并行度
合并小文件
执行 Compaction 或 Rewrite Data Files

3. 分区设计不合理

分区太细:

目录和文件数量爆炸

分区太粗:

查询需要扫描大量数据

常见分区字段包括:

event_date
dt
region
business_type

一般不要把高基数字段,例如用户 ID,直接作为目录分区字段。

4. Schema 混乱

不同批次写入的数据字段、类型和时间精度不一致,会导致读取失败或结果错误。

5. 维护任务缺失

表格式虽然提供了快照和版本,但仍然需要定期执行:

清理旧版本
合并小文件
清理删除文件
整理 Manifest
清理孤立文件

6. 权限和敏感数据泄露

数据湖集中保存大量原始数据,如果权限控制不足,风险可能比多个独立数据库更高。


十二、一个典型的数据流示例

以订单系统为例:

MySQL orders 表
        ↓
Flink CDC / Debezium
        ↓
Kafka
        ↓
Flink 或 Spark
        ↓
Hudi / Iceberg 表
        ↓
Trino 查询、Spark 聚合、BI 报表

具体分层可以是:

Bronze:保存原始 Binlog 事件
Silver:合并订单的最新状态
Gold:按天、地区、商品汇总销售指标

如果订单状态经常更新:

Hudi:通常适合直接做 Upsert
Iceberg:也可以通过 Merge、Delete Files 或文件重写实现

如果主要需求是多引擎访问、长期治理和分区演进:

Iceberg:通常更值得优先评估

十三、数据湖、Hudi 和 Iceberg 的关系

它们不是同一层的概念:

数据湖:整体架构和存储理念
Hudi / Iceberg / Delta Lake:数据湖表格式
Parquet / ORC:数据文件格式
Spark / Flink / Trino:计算和查询引擎
S3 / OSS / HDFS:底层存储

一个完整组合可能是:

OSS
  + Iceberg
  + Parquet
  + Flink
  + Spark
  + Trino

或者:

S3
  + Hudi
  + Parquet
  + Flink CDC
  + Spark

所以不能简单问“数据湖和 Iceberg 哪个选”,因为它们通常不是竞争关系。


十四、什么时候适合建设数据湖?

比较适合的场景:

数据来源多且格式复杂
数据规模增长很快
需要保存原始数据
需要批处理和流处理
需要支持机器学习
多个计算引擎共同访问
需要 CDC、Upsert 或增量读取

如果只是一个小系统、数据量不大、每天几张结构化表做报表,那么:

数据库 + 简单数仓

可能比建设完整数据湖更合适。

数据湖不是“数据量大了就一定要上”的产品,而是一套适合特定规模和数据复杂度的架构。


十五、学习顺序建议

可以按下面的顺序理解:

1. 了解对象存储和 HDFS
2. 学习 Parquet、ORC 等文件格式
3. 理解分区、列裁剪、谓词下推
4. 学习 Spark 或 Flink
5. 理解数据湖分层:Bronze / Silver / Gold
6. 学习 Iceberg、Hudi 或 Delta Lake
7. 学习 Catalog、事务和快照
8. 学习小文件、Schema 和数据治理

如果重点是通用数据湖和多引擎:

Parquet → Iceberg

如果重点是 CDC 和高频 Upsert:

Kafka / Flink CDC → Hudi

总结

数据湖的核心不是“把文件放到对象存储里”,而是建立一套能够长期保存、加工、查询和治理多种数据的系统。

可以用下面的公式概括:

数据湖
=
低成本存储
+
多格式数据
+
批流计算
+
表格式
+
Catalog
+
数据治理

其中:

Parquet / ORC:保存数据文件
Hudi / Iceberg / Delta Lake:管理数据湖表
Spark / Flink / Trino:处理和查询数据
S3 / OSS / HDFS:提供底层存储

最关键的一点是:

没有数据治理的数据湖,容易变成数据沼泽;真正可用的数据湖必须同时解决存储、计算、表管理、质量、权限和生命周期问题。

更多推荐