库 / SDK
delta-io/delta avatar
delta-io/delta

Delta Lake 的取舍:事务日志、存储前提与多引擎兼容的边界

项目速览:一个开源存储框架,支持使用 Spark、PrestoDB、Flink、Trino 和 Hive 等计算引擎和 API 构建 Lakehouse 架构。

8,996 个 Star2,173 个 ForkScalaApache-2.0

秒懂

它是什么?
Delta Lake 是一个开源存储框架,用事务日志在数据湖上实现 ACID 语义。本文基于其官方文档与仓库结构,分析它的工作机制、运行要求、兼容性承诺,以及哪些场景不适合选它。
适合谁用?
Delta Lake 适合那些已经以 Spark 为主要计算引擎、且底层存储能提供原子可见性、互斥创建和一致列出的团队。它不适合存储系统本身缺乏这些保证、或者主要依赖 Flink 写入且不能接受预览版连接器的场景。
能商用吗?
可以。Apache-2.0 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库在最近一天内有新的提交。
用什么语言写的?
主要是 Scala(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。

开源项目深度解析

它解决的是数据湖缺事务的问题

Delta Lake 解决的是数据湖上缺少事务保证的问题。传统对象存储上的文件写入是分散的,读者可能看到半成品,并发写者之间也没有隔离。Delta Lake 用一套事务日志协议,把一组文件操作包装成原子提交。它的目标用户是那些想保留数据湖的低成本存储,又希望获得类似数据仓库的事务语义的团队。仓库描述里明确提到 Lakehouse 架构,并列出 Spark、PrestoDB、Flink、Trino、Hive 等计算引擎。这不是一个存储系统,而是一层定义在存储之上的格式与协议。

事务日志协议是核心机制

Delta Lake 的事务保证来自 Delta Transaction Log Protocol,仓库里有独立的 PROTOCOL.md 文件描述规范。每次写操作会向事务日志追加一个原子条目,记录新增或删除的文件。读者通过重放日志来确定表的最新快照。并发控制上,文档声称保证可串行化,即并发读写的结果等价于某个串行顺序。这个机制的关键在于,所有引擎都遵循同一套协议,因此 Spark 写的数据,Trino 能读。但协议本身不是免费的,每次提交都要写日志,小文件频繁提交会带来额外开销。文档没有给出性能数字,这一点需要用户自行验证。

存储系统的三个硬性前提

Delta Lake 的 ACID 保证完全依赖底层存储的原子性和持久性。README 列出了三个要求:原子可见性,文件要么整体可见要么完全不可见;互斥创建,同一时刻只有一个写者能在最终位置创建或重命名文件;一致列表,文件写入后,后续所有目录列表必须返回该文件。这三个条件不是所有对象存储都默认满足。比如某些兼容 S3 的存储可能不保证强一致列表,或者重命名操作不是原子的。文档指向了 Storage Configuration 页面,但具体哪些服务商满足条件需要逐个确认。如果存储不满足这些前提,Delta Lake 的事务承诺就会失效,这是选型时必须先验证的边界。

运行方式与版本对应关系

Delta Lake 的接入方式取决于计算引擎。对 Spark 用户,通过 DataFrameReader 和 Writer 的选项来读写,比如 spark.read.format("delta").load(path)。Python 用户可以从 PyPI 安装 delta-spark 包。仓库还列出了 Delta Standalone,这是一个单节点 Java 库,实现了事务日志协议,可供 Flink、Hive、Beam 等框架调用。版本兼容性有明确规则:直接 Java/Scala/Python API 中,文档标注为稳定的类和方法视为公开 API,其余视为内部实现,可能跨版本变动。Spark 相关 API 的选项在 Delta Lake 的一个大版本内保持稳定,例如 1.x.x。这意味着升级 Delta Lake 时,不能假设所有代码都无需修改,尤其是用了内部 API 的代码。

兼容性承诺的正面与反面

数据存储兼容性上,Delta Lake 承诺向后兼容,即新版本总能读旧版本写的表。但前向兼容不保证,旧版本可能读不了新版本产生的表。协议变更通过 Protocol action 中的最小读写版本号来标识。这个设计是务实的,允许协议演进,但代价是升级有方向性。如果你用多个引擎,它们各自的 Delta Lake 连接器版本可能不同,旧连接器可能无法读取新协议的表。文档没有给出具体版本对照表,只提到 releases 页面有各版本与 Spark 版本的兼容信息。实际部署时,需要统一各引擎的连接器版本,否则可能遇到读不出来的情况。

多引擎支持中的不对称性

README 列出的集成并非对等。Spark 连接器是主推的,文档和 API 都以它为中心。Flink 连接器明确标注为 Preview,意味着它可能不稳定,API 也可能变化。PrestoDB 和 Hive 的连接器只支持读,不支持写。Trino 支持读写,但它是独立于本仓库的第三方连接器。Delta Standalone 提供了 Scala 和 Java 的读写能力,但它是单节点库,不适用于分布式写入场景。这种不对称性意味着,如果你的主引擎不是 Spark,而是 Flink 或 Presto,那么写入 Delta Lake 的路径要么是预览版,要么根本不存在。这是一个实际的限制,不是宣传材料里会强调的。

维护成本与许可证

Delta Lake 采用 Apache-2.0 许可证,商用没有障碍,但要注意它不提供任何担保。维护成本体现在几个方面:一是版本升级,需要关注 Protocol 版本变化,避免前向兼容问题;二是存储系统要求,如果存储服务商调整了一致性保证,Delta Lake 的行为可能受影响;三是多引擎环境下的连接器版本对齐。仓库本身是活跃的,最近有 v4.4.0 和 v3.3.3 两个版本线在维护,说明项目在持续演进。但活跃不等于稳定,新特性可能引入协议变更。升级前应该阅读 release notes,并检查 Protocol 版本是否被所有相关引擎支持。

替代方案与选择依据

与 Delta Lake 定位相近的替代方案是 Apache Iceberg 和 Apache Hudi。Iceberg 同样使用事务日志协议,但它的表格式设计更强调与引擎无关的规范,支持更多计算引擎的原生集成。Hudi 则更侧重写入路径的优化,比如 upsert 和增量处理。区别在于,Delta Lake 的协议最初为 Spark 设计,后来才扩展其他引擎,而 Iceberg 从一开始就追求多引擎平等。如果你的团队以 Spark 为主,Delta Lake 的集成最顺滑;如果多引擎平等是硬需求,Iceberg 可能是更稳妥的选择。但本文没有 Iceberg 或 Hudi 的详细对比数据,具体差异需要查阅各自文档。

编辑结论

Delta Lake 适合那些已经以 Spark 为主要计算引擎、且底层存储能提供原子可见性、互斥创建和一致列出的团队。它不适合存储系统本身缺乏这些保证、或者主要依赖 Flink 写入且不能接受预览版连接器的场景。采用前应先确认存储服务商的文档是否明确支持原子重命名和强一致列表,再对照当前 Spark 版本选择对应的 Delta Lake 发行版。若这些前提不成立,Delta Lake 的 ACID 承诺会落空。它的协议向后兼容,但前向兼容会被新特性打破,升级前要检查 Protocol 版本。

官方来源

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
社区笔记

社区笔记