Azure Databricks 中的存档支持

重要

此功能在 Databricks Runtime 13.3 LTS 及更高版本中作为公共预览版提供。

借助 Azure Databricks 中的存档支持,可以在包含 Delta 表的云对象存储上使用基于云的生命周期策略。 在 Delta Lake 表上启用存档支持可以有效地告知Azure Databricks忽略早于表中指定时间段的文件。

要求

Azure Databricks仅对Azure存档提供存档支持。 请参阅Azure文档,了解如何使用生命周期管理优化成本

为何要启用存档支持?

存档支持仅允许可在不接触存档文件的情况下正确回答的查询。 这些查询包括符合以下任一条件的查询:

  • 仅查询元数据。
  • 其筛选器不需要扫描任何已存档的文件。

所有需要存档文件中数据的查询都会失败。

重要

Azure Databricks 永远不会为那些需要存档文件来返回正确结果的查询提供结果。

为Azure Databricks中的表启用存档支持不会创建或更改为云对象存储定义的生命周期策略。 请参阅更改生命周期管理转换规则

如果没有存档支持,对 Delta 表执行的操作可能会中断,因为数据文件或事务日志文件已移动到存档位置,在查询时不可用。 存档支持引入了优化,尽可能避免查询已存档的数据。 它还增加了新语法来标识必须从存档存储还原以完成查询的文件。

针对存档数据优化的查询

Azure Databricks中的存档支持针对 Delta 表优化以下查询。

查询 新行为
SELECT * FROM <table_name> LIMIT <limit> [WHERE <partition_predicate>] 自动忽略已存档的文件,并从非存档存储层中的数据返回结果。
Delta Lake 维护命令:OPTIMIZEZORDERANALYZEPURGE 自动忽略已存档的文件,并对表的其余部分运行维护。
覆盖数据或删除数据的 DDL 和 DML 语句,包括:REPLACE TABLEINSERT OVERWRITETRUNCATE TABLEDROP TABLE 将目标归档数据文件的事务日志条目标记为已删除。
FSCK REPAIR TABLE 忽略已存档的文件,只检查未达到生命周期策略的文件。

早期失败和错误消息

对于必须扫描已存档文件以生成正确结果的查询,配置 Delta Lake 的存档支持可以确保:

  • 如果查询尝试访问已存档的文件,则查询会提前失败,从而减少浪费的计算并允许用户快速调整和重新运行查询。
  • 错误消息通知用户查询失败,因为查询尝试访问已存档的文件。

用户可以使用 SHOW ARCHIVED FILES 语法生成必须还原的文件的报告。 请参阅显示已存档的文件

重要

如果收到错误“Not enough files to satisfy LIMIT”,则表示表的未存档的文件中没有足够的数据行来满足 LIMIT 指定的记录数。 降低 LIMIT 子句以找到足够的未归档行来满足指定的 LIMIT。 请参阅限制

启用存档支持

通过手动指定基础云生命周期管理策略中配置的存档间隔,为 Delta 表启用存档支持。

ALTER TABLE <table_name> SET TBLPROPERTIES(delta.timeUntilArchived = 'X days');

设置 timeUntilArchived 时间会告知 Azure Databricks,忽略 Delta Lake 表中早于该指定时间段的文件。 此设置独立于云帐户的生命周期策略。 对一个的更改不会影响另一个。 如果在云帐户中更新生命周期策略,还必须更新 Delta Lake 表上的存档设置。 请参阅更改生命周期管理转换规则

如果在未为云对象存储设置生命周期策略的情况下启用此设置,则存档支持允许查询成功,结果包括标记为存档的文件中的数据。 请参阅 Azure Databricks 如何为还原数据采样?

警告

云生命周期策略不得存档 Delta 事务日志(_delta_log/ 目录)。 请参阅限制

重要

存档支持完全依赖于兼容的Azure Databricks计算环境,仅适用于 Delta 表。 配置存档支持不会更改 OSS Delta Lake 客户端或 Databricks Runtime 12.2 LTS 及更低版本的行为、兼容性或支持。

显示已存档的文件

若要标识必须还原以完成给定查询的文件,请使用 SHOW ARCHIVED FILES

SHOW ARCHIVED FILES FOR table_name [ WHERE predicate ];

此操作以 Spark 数据帧的形式返回已存档文件的 URI。 按照对象存储提供程序中记录的说明还原必要的已存档文件。 有关Azure Databricks如何检查还原数据的信息,请参阅 Azure Databricks如何取样还原数据?

注意

在此操作期间,Delta Lake 只能访问事务日志中包含的数据统计信息。 默认情况下,表中的前 32 列收集以下统计信息:

  • 最小值
  • 最大值
  • 空值计数
  • 总记录数

返回的文件包括必须读取的所有已存档的文件,以确定文件中是否存在满足谓词的记录。 Databricks 建议提供包含对数据进行分区、z 排序或聚类分析的字段的谓词,以减少必须还原的文件数量。

更新或删除存档的数据

如果运行影响存档文件中数据的 MERGEUPDATEDELETE 操作,操作将失败。 必须将数据还原到支持快速检索的存储层才能运行这些操作。 使用 SHOW ARCHIVED FILES 确定必须还原的文件。

Azure Databricks如何对已恢复的数据进行抽样?

当 Azure Databricks 在启用存档支持的表上准备扫描时,它会抽样查询过程中需要的早于指定保留期的文件,以判断这些文件是否已经被还原。 如果结果显示被认为已存档的采样文件已还原,Azure Databricks认为查询的所有文件都已还原,并且继续处理查询。 结果包括标记为存档的文件中的数据。

采样可能不适用于所有查询,请参阅 “限制”。

限制

存在以下限制:

  • 存档支持仅适用于数据文件。 如果 Delta 事务日志(_delta_log/ 目录)中的任何文件都移动到存档存储层,则表将完全无法访问,针对表的所有查询都会失败。 必须配置您的云生命周期策略,使_delta_log/路径不包含在存档中。 请参阅 S3 生命周期配置的示例
  • 不支持不基于文件创建时间的生命周期管理策略。 包括基于访问时间的策略和基于标记的策略。
  • 不能在包含已存档文件的表上使用 DROP COLUMN
  • REORG TABLE APPLY PURGE 会尽量进行尝试,但仅适用于未存档的删除矢量文件和引用数据文件。 PURGE 无法删除已存档的删除矢量文件。
  • 延长生命周期管理过渡规则会导致不可预料的行为。 请参阅延长生命周期管理转换规则
  • LIMIT 对启用了存档支持的表的查询不会触发还原数据的采样。 如果还原表的数据,则查询还原的数据时,大多数查询都会成功,但 LIMIT 查询返回 DELTA_ARCHIVED_FILES_IN_LIMIT 错误。 请参阅 Azure Databricks 如何为还原数据采样?

更改生命周期管理转换规则

如果更改云生命周期管理转换规则的时间间隔,则必须将属性 delta.timeUntilArchived 更新为同一间隔。

如果存档前的时间间隔缩短(自文件创建后的时间缩短),则更新表属性后,Delta 表的存档支持将继续正常运行。

延长生命周期管理转换规则

如果存档前的时间间隔延长(以在触发存档之前添加更多时间),则将 delta.timeUntilArchived 属性更新为新值可能会导致错误。 更改数据保留策略时,云提供商不会自动将文件从已存档的存储中还原。 这表示之前符合存档条件,但现在被视为不符合存档条件的文件仍会存档。

重要

为避免错误,请勿将 delta.timeUntilArchived 属性的值设置为大于最近已存档数据的实际存在时长。

假设存档的时间间隔从 60 天更改为 90 天:

  1. 当策略更改时,60 到 90 天的所有记录都已存档。

  2. 30 天内,不会存档任何新文件(当策略延长时,最早的非存档文件已存在 60 天)。

  3. 30 天后,生命周期策略会正确描述所有已存档的数据。

delta.timeUntilArchived 设置会根据 Delta 事务日志记录的文件创建时间跟踪设置的时间间隔。 它对基础策略没有明确的了解。 在旧存档阈值和新存档阈值之间的滞后期间,可以采取以下方法之一来避免查询已存档的文件:

  1. 可以将delta.timeUntilArchived设置保留为旧阈值,直至经过足够的时间后所有文件都已存档。

    • 在上述示例中,连续 30 天里,每天会有额外一天的数据被 Azure Databricks 视为已存档,但仍需由云提供商存档。 这不会导致错误,但会忽略一些可以查询的数据文件。
    • 30 天后,将 delta.timeUntilArchived 更新为 90 days
  2. 可以每天更新 delta.timeUntilArchived 设置,以反映滞后期间的当前间隔。

    • 虽然云策略设置为 90 天,但已存档数据的实际存在时长会实时变化。 例如,在 7 天后,将 delta.timeUntilArchived 设置为 67 days 可准确反映所有已存储数据文件的存在时长。
    • 只有在必须访问热存储层中的所有数据的情况下,才需要此方法。

注意

更新 delta.timeUntilArchived 的值不会更改存档的数据。 它只是更改了Azure Databricks将哪些数据视为已存档。