数据湖是什么
数据湖把原始与加工后的数据集中放在廉价的分布式存储上(HDFS、S3、OSS 等),schema 在读时确定,因此可以先入库、后建模。它由三层组合而成:存储层负责容量与成本,表格式层(Iceberg、Hudi、Delta)负责事务、快照与元数据管理,计算层(Spark、Flink、Trino)按需读取。与数据仓库的区别主要是「写时建模」变成「读时建模」,代价是查询性能与治理要额外补齐。
基本信息
| 存储层 | HDFS、S3、OSS 等对象存储,成本低、容量大 |
|---|---|
| 表格式层 | Iceberg、Hudi、Delta 提供事务与元数据管理 |
| 计算层 | Spark、Flink、Trino 等按需读取 |
| 建模时机 | schema on read,读取时才绑定结构 |
| 治理要点 | 分区规范、生命周期、元数据目录、权限边界 |
为什么要分层
没有目录规范与治理的数据湖会退化成「数据沼泽」:重复数据、口径不一、找不到可信来源。落地区、清洗区、应用区分层是必要约定,分层的同时也要明确每一层由谁写入、保留多久、下游能依赖哪一列作为分区键。
分区目录示意
分区目录示意
s3://lake/landing/orders/2026/10/11/ 原始落地
s3://lake/curated/dwd/orders/dt=2026-10-11/ 清洗明细
s3://lake/marts/ads/sales_daily/dt=2026-10-11/ 应用结果典型使用场景
- 统一存放原始日志与业务数据,先用低成本存储保底,再做后续加工
- 一份数据多引擎共用:批处理用 Spark、交互查询用 Trino,不必各自复制一份
- 增量更新与时间旅行:Iceberg、Hudi 支持按快照读取历史版本
- 海量冷数据归档:把不常访问的明细留在湖里,仓库只保留聚合结果
- 机器学习特征准备:原始数据直接读取,减少一次落地转换
常见误区对照
| 做法 | 后果 | 改进方向 |
|---|---|---|
| 不分层、任意路径写入 | 找不到可信数据源,重复计算 | 固定 landing/curated/marts 三段 |
| 过度分区(按小时再按字段拆) | 小文件激增,LIST 与元数据开销大 | 按实际查询条件收敛分区粒度 |
| 不做生命周期管理 | 存储成本持续上升 | 按访问频率设置归档与清理策略 |
| 小文件长期不合并 | 查询扫描与打开文件开销放大 | 周期性 compact 或写入时控制文件大小 |
对象存储上的 rename 是拷贝加删除,成本与耗时都随文件大小上升;小文件与过度分区会显著放大这一代价,写入路径尽量做到一次成型而不是反复搬移。