Delta Lake:给数据湖加上事务能力的存储框架

做数据开发的人基本都踩过这个坑:数据写到一半程序挂了,结果数据目录里多了一堆残缺文件,下游任务读到脏数据直接报错。传统数据湖(比如直接往 HDFS 或 S3 上写 Parquet 文件)没有事务保证,写操作不是原子的,出问题就得手动清理。

Delta Lake 就是来解决这个问题的。它是 Databricks 开源的存储框架,给数据湖加上了 ACID 事务能力,让数据湖也能像数据库一样可靠地读写。

正文顶部截图

它到底干了什么

Delta Lake 的核心思路很简单:在 Parquet 文件之上加一层事务日志(Transaction Log)。每次写操作都会先记录到日志里,只有日志写成功了,数据才算写入完成。

这样带来的好处很直接:

  • 写入是原子的:要么全部写成功,要么全部回滚,不会出现半成品数据
  • 支持并发读写:多个任务同时读写同一张表,不会互相干扰
  • 支持时间旅行:可以回溯到任意历史版本,查看某个时间点的数据快照
  • 支持 Schema 演进:表结构可以安全地变更,不用担心新旧数据不兼容

这些能力在数据库里是标配,但在数据湖上以前是缺失的。Delta Lake 补上了这块短板。

兼容性是它的一大优势

Delta Lake 不挑引擎。它支持 Spark、PrestoDB、Flink、Trino、Hive 等主流计算引擎,API 覆盖 Scala、Java、Python、Rust、Ruby。这意味着你不需要换技术栈,在现有的数据管道上就能接入。

比如你已经在用 Spark 处理数据,只需要把输出格式从 Parquet 换成 Delta,就能获得事务能力。读写接口基本不用改,迁移成本很低。

README区域截图

底层存储也不挑,HDFS、S3、Azure Blob Storage、Google Cloud Storage 都能用。Delta Lake 对存储系统只有三个要求:原子可见性、互斥写入、一致列举。大部分云存储和分布式文件系统都满足这些条件。

和数据仓库比,它赢在哪

传统数据仓库(比如 Hive、Redshift)也能提供事务能力,但数据湖方案有几个优势:

第一,存储成本低。数据湖直接用对象存储(S3、GCS 这些),价格比数据仓库便宜很多。第二,数据不需要搬迁。原始数据已经在数据湖里了,Delta Lake 直接在上面加一层事务日志,不用把数据复制到另一个系统。第三,开放格式。底层是 Parquet,任何能读 Parquet 的工具都能读 Delta 表,不存在厂商锁定的问题。

当然,数据仓库在查询性能优化上还是有优势的,特别是对复杂查询的优化器。但如果你的场景更偏向数据工程(ETL、数据管道、数据质量保证),Delta Lake 是更灵活的选择。

实际使用体验

安装很简单,pip 装 delta-spark 包就行。配置好 SparkSession,把输出格式指定为 delta,其他代码基本不用动。

构建项目用 SBT,Java 版本要求至少 17。测试用 build/sbt test 跑全量,也可以指定单个测试套件。Python 测试需要 Conda 环境,按文档配好就能跑。

社区方面,Delta Lake 有自己的 Slack 频道和 LinkedIn 主页,问题可以去 GitHub Issues 反馈。项目用 Apache 2.0 协议,商用也没问题。

适合谁用

如果你在做大数量级的数据处理,需要保证数据一致性,Delta Lake 值得一看。特别是那些已经在用 Spark 但苦于数据质量问题的团队,接入成本低,收益明显。

对于数据平台团队来说,Delta Lake 的 Schema 演进和时间旅行功能特别实用。线上出问题了可以快速回滚,不需要从备份恢复。表结构变更也不用停服,直接加字段就行。

8800 多个 Star,Databricks 背后持续维护,社区活跃度不错。不是那种昙花一现的项目。

8800 多个 Star,Databricks 背后持续维护,社区活跃度不错。不是那种昙花一现的项目。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐