Azure Databricks 中的存档支持
重要
此功能在 Databricks Runtime 13.3 LTS 及更高版本中作为公共预览版提供。
Azure Databricks 中的存档支持引入了一系列功能,使你能够在包含 Delta 表的云对象存储上使用基于云的生命周期策略。
重要
Azure Databricks 仅为 Azure 存档提供存档支持。 请参阅关于通过生命周期管理优化成本的 Azure 文档。
为何要启用存档支持?
存档支持仅允许可在不接触存档文件的情况下正确回答的查询。 这些查询包括符合以下任一条件的查询:
- 仅查询元数据。
- 其筛选器不需要扫描任何已存档的文件。
所有需要存档文件中数据的查询都会失败。
重要
对于需要存档文件才能返回正确结果的查询,Azure Databricks 永远不会返回结果。
如果没有存档支持,对 Delta 表执行的操作可能会中断,因为数据文件或事务日志文件已移动到存档位置,在查询时不可用。 存档支持引入了优化,尽可能避免查询已存档的数据。 它还增加了新语法来标识必须从存档存储还原以完成查询的文件。
为 Azure Databricks 中的表启用存档支持时,不会创建或更改为云对象存储定义的生命周期策略。 对于所需的结果,云生命周期策略和 delta.timeUntilArchived
设置应相等。
存档数据的查询优化
Azure Databricks 中的存档支持针对 Delta 表优化以下查询:
查询 | 新行为 |
---|---|
SELECT * FROM <table_name> LIMIT <limit> [WHERE <partition_predicate>] |
自动忽略已存档的文件,并从非存档存储层中的数据返回结果。 |
Delta Lake 维护命令:OPTIMIZE 、ZORDER 、ANALYZE 、PURGE |
自动忽略已存档的文件,并对表的其余部分运行维护。 |
覆盖数据或删除数据的 DDL 和 DML 语句,包括:REPLACE TABLE 、INSERT OVERWRITE 、TRUNCATE TABLE 、DROP TABLE |
将目标已存档数据文件的事务日志条目标记为已删除。 |
FSCK REPAIR TABLE |
忽略已存档的文件,只检查未达到生命周期策略的文件。 |
请参阅限制。
早期失败和错误消息
对于必须扫描已存档文件以生成正确结果的查询,配置 Delta Lake 的存档支持可以确保:
- 如果查询尝试访问已存档的文件,则查询会提前失败,从而减少浪费的计算并允许用户快速调整和重新运行查询。
- 错误消息通知用户查询失败,因为查询尝试访问已存档的文件。
用户可以使用 SHOW ARCHIVED FILES
语法生成必须还原的文件的报告。 请参阅显示已存档的文件。
重要
如果收到错误“Not enough files to satisfy LIMIT
”,则表示表的未存档的文件中没有足够的数据行来满足 LIMIT
指定的记录数。 降低 LIMIT
子句以找到足够的未归档行来满足指定的 LIMIT
。
启用存档支持
可以通过手动指定基础云生命周期管理策略中配置的存档间隔来启用 Azure Databricks 中对 Delta 表的存档支持,如以下示例语法所示:
ALTER TABLE <table_name> SET TBLPROPERTIES(delta.timeUntilArchived = 'X days');
有效地启用存档支持时,系统会告知 Azure Databricks 忽略早于指定时间段的文件。 如果在没有为云对象存储设置生命周期策略的情况下启用此设置,Azure Databricks 仍会忽略基于此指定阈值的文件,但不会存档任何数据。
Delta Lake 不会直接与云帐户中配置的生命周期管理策略交互。 如果更新云帐户中的策略,则必须更新 Delta 表的策略。 请参阅更改生命周期管理转换规则。
重要
存档支持完全依赖于兼容的 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 列收集以下统计信息:
- 最小值
- 最大值
- Null 计数
- 总记录数
返回的文件包括必须读取的所有已存档的文件,以确定文件中是否存在满足谓词的记录。 Databricks 建议提供包含对数据进行分区、z 排序或聚类分析的字段的谓词,以减少必须还原的文件数量。
更新或删除存档的数据
如果运行影响存档文件中数据的 MERGE
、UPDATE
或 DELETE
操作,操作将失败。 必须将数据还原到支持快速检索的存储层才能运行这些操作。 使用 SHOW ARCHIVED FILES
确定必须还原的文件。
已还原数据的 Azure Databricks 示例如何?
当 Azure Databricks 准备对启用了存档支持的表进行扫描时,它会对比查询所需的指定保留期更早的文件进行采样,以确定文件是否已还原。
如果结果表明假定已存档的采样文件已还原,则 Azure Databricks 会假定查询的所有文件都已还原,就会开始处理查询。
限制
存在以下限制:
- 不支持不基于文件创建时间的生命周期管理策略。 包括基于访问时间的策略和基于标记的策略。
- 不能在包含已存档文件的表上使用
DROP COLUMN
。 REORG TABLE APPLY PURGE
会尽量进行尝试,但仅适用于未存档的删除矢量文件和引用数据文件。PURGE
无法删除已存档的删除矢量文件。- 延长生命周期管理转换规则会导致意外行为。 请参阅延长生命周期管理转换规则。
更改生命周期管理转换规则
如果更改云生命周期管理转换规则的时间间隔,则必须更新 delta.timeUntilArchived
属性。
如果存档前的时间间隔缩短(自文件创建后的时间缩短),则更新表属性后,Delta 表的存档支持将继续正常运行。
延长生命周期管理转换规则
如果存档前的时间间隔延长(以在触发存档之前添加更多时间),则将 delta.timeUntilArchived
属性更新为新值可能会导致错误。 更改数据保留策略时,云提供商不会自动将文件从已存档的存储中还原。 这表示之前符合存档条件,但现在被视为不符合存档条件的文件仍会存档。
重要
为避免错误,请勿将 delta.timeUntilArchived
属性的值设置为大于最近已存档数据的实际存在时长。
假设存档的时间间隔从 60 天更改为 90 天:
- 当策略更改时,60 到 90 天的所有记录都已存档。
- 30 天内,不会存档任何新文件(当策略延长时,最早的非存档文件已存在 60 天)。
- 30 天后,生命周期策略会正确描述所有已存档的数据。
delta.timeUntilArchived
设置会根据 Delta 事务日志记录的文件创建时间跟踪设置的时间间隔。 它对基础策略没有明确的了解。 在旧存档阈值和新存档阈值之间的滞后期间,可以采取以下方法之一来避免查询已存档的文件:
- 可以将
delta.timeUntilArchived
设置保留为旧阈值,直到经过足够的时间,使所有文件都存档。- 按照上面的示例,前 30 天内每天的数据将被视为已由 Azure Databricks 存档,但仍需由云提供商存档。 这不会导致错误,但会忽略一些可以查询的数据文件。
- 30 天后,将
delta.timeUntilArchived
更新为90 days
。
- 可以每天更新
delta.timeUntilArchived
设置,以反映滞后期间的当前间隔。- 虽然云策略设置为 90 天,但已存档数据的实际存在时长会实时变化。 例如,在 7 天后,将
delta.timeUntilArchived
设置为67 days
可准确反映所有已存储数据文件的存在时长。 - 只有在必须访问热存储层中的所有数据的情况下,才需要此方法。
- 虽然云策略设置为 90 天,但已存档数据的实际存在时长会实时变化。 例如,在 7 天后,将
注意
更新 delta.timeUntilArchived
的值不会更改存档的数据。 只会更改被 Azure Databricks 视为已存档的数据。