1. 数据湖的演进:从传统数仓到数据湖,Delta Lake 的定位与价值
聊数据湖之前,我想先问你一个问题:你现在的数据架构,能扛住实时 API 的写入压力吗?
我见过太多团队,数仓跑得好好的,一上实时流就崩。要么是数据对不上,要么是查询慢得离谱。说白了,传统那套东西,是为批处理设计的,不是为实时设计的。
1.1 传统数仓:曾经的王者,如今的瓶颈
传统数仓,比如 Teradata、Oracle、Greenplum,核心思路是 ETL——先提取、再转换、最后加载。数据是结构化的,Schema 是提前定死的。
核心特征:
- 强 Schema 约束:写入前必须定义好字段类型
- 批处理为主:通常是 T+1 延迟
- 存储与计算耦合:扩容成本高
- 只支持结构化数据:JSON、日志、图片?没门
我在 2018 年帮一家金融客户做风控系统改造。他们的 Oracle 数仓每天凌晨跑 4 小时 ETL,白天业务一忙,查询就超时。后来上了实时风控,要求秒级响应,传统数仓直接跪了。嗯,这就是瓶颈——不是它不好,是时代变了。
1.2 数据湖的诞生:存储一切,但管理混乱
2010 年左右,Hadoop 生态兴起,数据湖的概念被提出来。核心思想很简单:存原始数据,存所有格式,存所有 Schema。想怎么用,随你。
| 维度 | 传统数仓 | 数据湖(早期) |
|---|---|---|
| 数据格式 | 结构化表 | 结构化 + 半结构化 + 非结构化 |
| Schema | 写入时强制 | 读取时解析 |
| 存储成本 | 高(专用硬件) | 低(廉价对象存储) |
| 数据质量 | 高(ETL 清洗) | 低(垃圾进垃圾出) |
| 事务支持 | ACID | 无 |
你想想看,数据湖刚出来的时候,大家都很兴奋。但用着用着就发现问题了——数据湖变成了数据沼泽。
我记得有一次,一个同事往 HDFS 上写了几百个 Parquet 文件,文件名乱起,Schema 不一致。三个月后,没人知道哪些文件能用,哪些是脏数据。这就是没有事务、没有元数据管理的后果。
我曾经踩过的坑: 在纯 HDFS 上做实时写入,多个流同时写同一个目录,文件覆盖、数据丢失是家常便饭。没有 ACID,实时就是噩梦。
1.3 Delta Lake 的定位:给数据湖装上 ACID 引擎
Delta Lake 是什么?说白了,它不是一个存储系统,而是一个 存储层。它跑在 Parquet 文件之上,用事务日志(Transaction Log)来管理所有变更。
Delta Lake 的核心能力:
- ACID 事务:并发写入不冲突,读时一致性
- Schema 演进:允许字段增删改,不丢历史数据
- 时间旅行:查询任意历史版本的数据
- 统一批流:批处理和流处理共用同一份数据
- 兼容 Spark、Flink、Presto:生态无缝对接
我个人的习惯是,把 Delta Lake 看作 数据湖的操作系统。它管理文件的版本、并发、一致性,你只管读写就行。
1.4 为什么实时 API 场景需要 Delta Lake?
回到我们的课程主题——API 实时数据湖。实时 API 写入有几个特点:
- 高并发:成千上万个客户端同时写
- 小文件多:每条记录可能只有几百字节
- 延迟敏感:秒级甚至毫秒级可见
- 数据一致性要求高:不能丢、不能重复
传统数据湖(纯 HDFS/Parquet)根本搞不定这些。但 Delta Lake 可以,因为它有 乐观并发控制 和 文件合并机制。
一个小技巧: 我在做实时 API 接入时,通常把 Delta Lake 的 spark.databricks.delta.autoCompact 打开,这样小文件会自动合并,查询性能提升 3-5 倍。
1.5 知识体系总览:一张图看懂
下面这张图,是我梳理的本章知识体系。它展示了从传统数仓到数据湖,再到 Delta Lake 的演进路径,以及 Delta Lake 在实时 API 场景中的核心位置。
1.6 本章小结:Delta Lake 到底解决了什么?
回顾一下,我们从传统数仓聊到数据湖,再聊到 Delta Lake。核心就三句话:
- 传统数仓:强一致、高成本、不支持实时
- 早期数据湖:低成本、灵活、但没事务
- Delta Lake:在数据湖上实现了 ACID,让实时成为可能