什么才算开放的数据目录?Unity Catalog 推进开放湖仓
What makes a catalog open? Unity Catalog Advances the Open Lakehouse
Databricks 的 Unity Catalog 成为首个同时支持 Apache Iceberg REST catalog 规范中 REGISTER 与 UNREGISTER 的目录,表可在不移动数据的情况下迁入或迁出。
虽然现在几乎所有平台都支持开放格式,但什么才让一个目录真正开放?一个开放目录将你的数据保存在你拥有的存储中,在那里为你提供最佳功能,并支持数据可移植性:即能够将你的表移动到另一个目录,同时保持数据原地不动。可移植性是开放湖仓一体架构的核心原则,而这正是大多数目录的不足之处。
作为首个同时支持 Apache Iceberg™ REST 目录规范中 REGISTER 和 UNREGISTER 的目录,Databricks Open Lakehouse 中的 Unity Catalog 拓展了开放目录的含义:你的表可以在不移动任何数据的情况下,将现有 Iceberg 表移入或移出。Databricks 将 UNREGISTER 贡献给了 Iceberg REST 目录规范,使其成为开放标准。阅读解锁数据可移植性。
本文逐一介绍开放目录的三项要求、Unity Catalog 如何满足每一项要求,并比较同一张 Iceberg 表在不同平台上的情况。
超越开放格式:开放目录的三项要求
湖仓一体架构的开放程度取决于目录。许多提供商仍在其目录中的主要表类型上使用专有格式,因此格式值得关注。但除此之外,一个开放目录还必须满足三项要求:

| 开放目录要求 | 含义 | 缺失时的后果 |
|---|---|---|
| 1. 你拥有的存储 | 表存放在客户拥有的存储中,而非托管存储(即“提供商控制的存储”) | 存储桶位于提供商的云账户中,而非你的账户。存储通过提供商计费,因此你需要支付存储“租金”,此外提供商还会向你收取数据迁出费用。 |
| 2. 包含最佳功能 | 自动优化和所有高级表功能都可在客户自有存储中的表上使用,而不限于提供商控制存储中的表 | 团队将表迁移到提供商控制的存储中,以获得 客户自有存储方案所缺少的功能。从那时起,提供商的发展路线图就决定了你能对自己的数据做什么。 |
| 3. 自由迁移,无需复制 | 表可以通过 REGISTER 和 UNREGISTER 进入和离开目录,数据留在原地 | 更换目录意味着导出并重写每一张 表,才能将其迁出提供商控制的存储。 |
[1] Unity Catalog 托管表及所有表类型的客户自有存储
大多数数据平台支持 Apache Iceberg 等开放表格式。然而,当这些表存放在属于提供商的存储桶中时,你的表就不再开放了。这让该格式仅在名义上开放:你无法在自己的云账户中看到这些文件,存储费用通过提供商计费,而离开则意味着必须先把每一张表复制出去。
Unity Catalog 采取了相反的做法。在 Databricks 中,“托管”描述的是由谁维护表,而不是由谁拥有其存储。目录负责优化、维护和升级,而文件则留在你拥有的云存储账户中,而不是其他平台常称为“托管存储”的专有存储中。在 Databricks 中,99% 的 UC 托管表位于客户自有存储中。而在围绕提供商控制存储构建的平台上,情况恰恰相反:几乎所有表都存放在提供商控制的存储中,并且默认被锁定在专有格式中。当你决定离开某个目录的那一天,这种差异就会显现出来。
[2] 最好的功能应当在你拥有的表上生效
只有当目录将这些表视为一等公民时,拥有自己的存储才有意义。一些平台提供客户自有存储选项,但将其最佳能力保留给由他们控制的托管存储中的表,制造出一种开放性的假象。开放路径确实存在,但功能较少,因此大多数表最终还是会落在提供商管理的存储中。
对于 Unity Catalog 托管表,最佳功能支持客户自有存储(“自带存储”)路径,而其他平台则存在限制:
- 故障安全数据保护。 Snowflake 和其他平台仅为其自有存储中的表保留故障安全恢复功能。相比之下,客户自有存储中的 Unity Catalog 托管表支持数据恢复:你可以查询较早版本或恢复已删除的表,最长可达 30 天。
- 自动优化。 在 Snowflake 中,在提供商控制的存储中进行数据压缩成本更高。对于其他平台,表维护和 V-order 适用于存储在客户自有存储中的表,而非通过快捷方式访问的数据。Databricks 的 Predictive Optimization 可在客户自有存储中以 Delta 和 Iceberg 格式对 Unity Catalog 托管表运行。
- 存储成本。 Snowflake 不会从你自己存储桶中的 Iceberg 表删除孤立文件,例如写入失败后遗留的文件,这意味着你仍需为没有任何表使用的文件付费。而在 Unity Catalog 托管表上,Predictive Optimization 会自动从你的存储桶中移除未被引用的文件,为你节省费用。
Unity Catalog 托管表的自动优化每年为我们节省了超过 100 万美元的存储成本,同时消除了每天繁琐的手动工作。—Abhinav Raghuvanshi,Zepto 数据工程副总监
[3] 开放目录提供数据可移植性:Unity Catalog 无需复制数据即可实现
判断目录是否开放的最重要测试是可移植性:你是否能随时通过在不同目录之间移动表来轻松离开该目录,而无需复制出数据。
直到最近,生态系统还没有一种标准方式将表从目录的管理中释放出来。因此,Databricks 向 Apache Iceberg REST 目录规范贡献了 UNREGISTER,让客户可以自由离开,而无需复制、移动或重写任何数据文件。
在 Unity Catalog 中,REGISTER 和 UNREGISTER 成对工作:
- UNREGISTER 将表从 Unity Catalog 中移除,并返回该表的最新元数据位置,即下一个目录接管提交所需的确切指针。
- REGISTER 将该元数据位置附加到新目录,新目录写入一条记录,将表名与其元数据关联起来。
这之所以可行,是因为 Unity Catalog 托管表驻留在你拥有的存储中。对于提供商控制的存储,无法执行注销,因为退出 API 无法向你提供你无法带走的文件指针。
Unity Catalog 托管表完全可移植且开放,没有锁定:你保留对自己数据的控制权。
开始使用
要在 Databricks 中开始使用,请联系您的客户团队以获取 REGISTER 和 UNREGISTER(私人预览版)的访问权限。借助 REGISTER 和 UNREGISTER,您的 Iceberg 表可以零数据拷贝迁移到 Databricks 中的 Unity Catalog,完全开放地保留在您自己的存储中,并获得 Unity Catalog 和 Predictive Optimization 的所有优势:
要了解更多信息,请阅读解锁数据可移植性。有关如何使用 Unity Catalog 托管表的更多详细信息,请参阅Unity Catalog 托管表文档,这些表存在于客户拥有的存储中。
路线图的下一步
未来,我们计划支持使用 SET MANAGED IN PLACE 将外部表或外部表转换为 Databricks 托管表。这将允许您保留与之前相同的客户定义的存储路径,并且不需要任何数据移动。
常见问题解答(FAQ)
Unity Catalog 是开放的吗?
是的。Unity Catalog 是开源的,并且满足开放目录的三项要求。其托管表(采用 Apache Iceberg 或 Delta Lake 格式)位于您拥有的云存储账户中,在那里获得完整的功能集,并且可以通过 REGISTER 和 UNREGISTER 迁移到另一个目录而无需拷贝数据。最重要的是,Unity Catalog 托管表位于客户拥有的存储中,因此 Databricks 中的 UNREGISTER 在 Unity Catalog 侧提供了无需数据移动的目录可移植性。使用 Unity Catalog 和 Iceberg REST Catalog Open API 也支持管理表的读写访问。
使用 Apache Iceberg 能防止供应商锁定吗?
仅靠它本身不能。位于提供商控制存储中的 Iceberg 表可能和专有表一样难以迁移,而位于您自己存储中的 Iceberg 表可能获得的功能较少。避免锁定还需要您拥有的存储、这些表上的完整功能,以及支持干净、无拷贝交接的目录。
Unity Catalog 托管表和托管存储有什么区别?
在 Unity Catalog 中,“托管”描述的是谁维护表,而不是谁拥有其存储。Unity Catalog 托管表由目录进行优化和维护,其文件位于您拥有的云存储账户中。在其他一些平台上,“托管存储”意味着提供商拥有和控制的存储,而不仅仅是优化。
我可以在不拷贝数据的情况下将表移出 Unity Catalog 吗?
可以。使用 UNREGISTER,您可以从 Unity Catalog 中移除表,并在另一个 Iceberg REST 目录中注册它,而无需拷贝数据文件。
Unity Catalog 托管表和托管存储有什么区别?
在 Unity Catalog 中,“托管”描述的是谁维护表,而不是谁拥有其存储。Unity Catalog 托管表由目录进行优化和维护,但其文件位于您拥有的云存储账户中。在其他一些平台上,“托管存储”意味着提供商拥有且通常以专有表格式保存的存储。
Databricks 可以写入外部 Iceberg 表吗?
外部 Iceberg 表在 Databricks 中是只读的,因为另一个目录拥有其提交,这可以防止两个目录写入同一个表。要让 Unity Catalog 管理客户拥有的存储中的表,请使用 REGISTER 将其注册到 Unity Catalog 中。您还可以使用 SET MANAGED 将外部表转换为客户拥有的存储中的 Unity Catalog 托管表。
来源:Databricks Blog · databricks.com