The Linux Foundation Projects
Delta Lake

Delta Lake 的事务日志协议及其实现

作者:Matthew Powers

本文解释了 Delta Lake 事务日志协议delta-io/delta 对 Delta Lake 事务日志协议的参考实现,以及其他已知的 Delta Lake 实现。

Delta Lake 遵循一种常见软件设计模式,该模式包含三个部分:

  1. 一个“规范”
  2. 一个参考实现
  3. 验收测试

Delta Lake 规范是 Delta 事务日志协议,参考实现是 delta-io/delta,验收测试在 Delta 验收测试中。

HTTP 也遵循这种设计模式,它有一个规范、几个参考实现和验收测试。

“Delta Lake”指代实现 Delta Lake 事务日志协议的多个代码库。Delta Lake 的一些已知实现是完全开源的,另一些则是专有的,具有封闭功能。

  • delta-io/delta-rs 实现是开源的,由来自不同组织的开发人员维护。
  • dask-contrib/dask-deltatable 实现是开源的,由 Dask 社区维护。
  • 有些实现是闭源的,例如 Microsoft Fabric 的 Delta Lake 实现(这只是众多闭源实现中的一个例子)。

数据湖仓架构允许 Delta Lake 事务日志协议的闭源和开源实现互操作。本文将讨论一些闭源功能,例如 Microsoft Fabric 实现中的 V 排序,并解释 Microsoft 的 Delta Lake 实现如何仍然可以互操作,因为它符合 Delta Lake 事务日志协议。

Delta Lake 事务日志协议是 Delta Lake 实现宇宙的中心,如下图所示:

让我们更严谨地深入研究 Delta Lake 事务日志协议的一些细节。

Delta Lake 事务日志协议

Delta Lake 事务日志协议规定了文件应如何存储在 Delta 表中,事务应如何记录,以及不同实现所需的协议版本/表功能。

所有 Delta Lake 实现都必须严格遵循 Delta Lake 事务日志协议。

一些常见的 Delta Lake 功能不在 Delta Lake 事务日志协议中。例如,没有规定查询引擎应如何在 Delta 表中对数据进行排序,以允许在查询 Delta 表时跳过更多文件。Delta Lake 事务日志协议没有规定写入器应支持层次排序、Z 排序、V 排序或任何其他特定类型的排序。这取决于各个 Delta Lake 实现。

要求是所有 Delta Lake 实现功能都必须完全符合 Delta Lake 事务日志协议中指定的受支持协议版本/表功能。

Delta Lake 的已知实现

Delta Lake 有几个已知的开源实现:

Delta Lake 也有几个闭源实现:

Delta Lake 的不同实现支持不同的协议版本/表功能。

例如,delta-io/delta-rs 支持比 delta-io/delta 更低的协议版本。

Delta Lake 的不同实现支持 Delta Lake 事务日志协议范围之外的不同功能,这里有一些例子:

  • delta-io/delta 支持 Z 排序,这在某些开源 Delta Lake 实现中尚不支持。
  • delta-io/delta-rs 有一个 `get_add_actions()` 方法,这在 Delta Standalone 中是可行的,但在任何其他 Delta Lake 实现中都不存在(有关更多详细信息,请参阅这篇博客文章)。
  • 如前所述,Microsoft Fabric Delta Lake 具有 V 排序,这是任何其他 Delta Lake 实现都不支持的。

一些 Delta Lake 实现甚至还不完整,无法完全支持早期的协议版本。

Delta Lake 事务日志协议的部分实现

一些 Delta Lake 实现仍在开发中,甚至不完全支持最早的读取器协议版本。

部分实现是可以接受的——我们都需要从某个地方开始。

例如,Dask 实现目前有一个最小可行的读取器,但需要更多工作才能满足读取器协议 v1 的要求。让我们更深入地研究 Delta Lake 写入器协议版本以了解更多信息。

Delta Lake 协议版本基础知识

以下是不同 Delta Lake 写入器协议版本的要求:

这些要求是累积的,因此写入器版本 3 要求所有版本 3 的要求和所有版本 2 的要求。

以这种累积方式指定协议版本有点过于严格,因此 Delta Lake 已过渡到表功能。

假设一个实现支持所有版本 2 和 3 的要求、生成列和列映射。乍一看,您可能认为这个 Delta Lake 实现是在写入器版本 5 上,但它实际上仍然停留在写入器版本 3 上,因为它尚未支持变更数据流。

这不必要的严格,因为有些实现可能选择永远不支持某个功能。这会让他们永远停留在某个协议版本上。

Delta Lake 已过渡到此处指定的表功能,以克服这一限制。实现现在可以跳到支持写入器版本 7,这不需要支持任何先前的表功能。然后,实现可以选择他们将支持哪些表功能。

Delta Lake 项目治理

Delta Lake 由 Linux 基金会管理。

delta-io/delta 代码仓库具有 Apache v2.0 许可证。

结论

delta-io/delta 是 Delta Lake 事务日志协议的参考实现。delta-io/delta 不支持且无法支持所有供应商功能,例如 Microsoft Fabric V 排序。支持所有供应商功能也不在 Delta Lake 事务日志协议的授权范围内。专有的 Databricks Runtime Delta Lake 实现也是如此。delta-io/delta 是 Delta Lake 事务日志协议的参考实现,但这并不意味着它具有专有实现的所有功能。

所有 Delta Lake 实现都必须严格遵循 Delta Lake 事务日志协议,但供应商和开源实现也可以选择添加与协议不冲突的附加功能。

Microsoft Fabric V 排序是一个很好的例子,它受益于 Delta Lake 数据湖仓存储系统。供应商特定的实现允许 Microsoft 用户访问特殊的性能优化。但由于他们严格遵守 Delta Lake 事务日志协议规范,由 Microsoft Delta Lake 创建或修改的任何 Delta 表也可以与其他 Delta Lake 事务日志协议的实现互操作。

LinkedIn 上关注我们的作者