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 场景中的核心位置。

数据湖演进与 Delta Lake 定位 传统数仓 ETL / 强 Schema T+1 / 结构化 早期数据湖 HDFS / Parquet 无事务 / 数据沼泽 Delta Lake ACID / 时间旅行 统一批流 实时 API 写入场景 高并发 / 小文件 / 秒级可见 / 强一致 💡 核心结论 Delta Lake 不是替代数据湖,而是给数据湖加上事务引擎。 它让实时 API 写入变得可靠、可查、可回溯。

1.6 本章小结:Delta Lake 到底解决了什么?

回顾一下,我们从传统数仓聊到数据湖,再聊到 Delta Lake。核心就三句话:

  1. 传统数仓:强一致、高成本、不支持实时
  2. 早期数据湖:低成本、灵活、但没事务
  3. Delta Lake:在数据湖上实现了 ACID,让实时成为可能