Azure Databricks 上 Delta Lake 支持的表报告的表大小不同于云对象存储中相应文件目录的总大小。 本文讨论存在这种差异的原因,以及控制成本的建议。
为什么 Delta 表大小与目录大小不匹配?
Azure Databricks 中通过 UI 和 DESCRIBE 命令报告的表大小是指磁盘上数据文件的总大小,这些文件在当前版本的 Delta 表中引用。 写入表的大多数操作都需要重写基础数据文件,但旧数据文件会保留一段时间以支持时间旅行查询。
注意
如果定期删除或更新表中的记录,删除向量可以加速查询并减少数据文件的总大小。 请参阅什么是删除向量?。
计算表的存储指标
适用于:
Databricks Runtime 18.0 及更高版本
若要了解总存储大小与表大小有何不同,请使用 ANALYZE TABLE … COMPUTE STORAGE METRICS。 此命令提供存储分配的详细细分,帮助你:
-
确定成本优化机会:查看可回收多少存储
VACUUM - 分析时间旅行开销:了解保留历史数据的成本
- 跟踪存储模式:通过定期运行命令来监视表存储随时间变化的方式
- 审核跨表存储:在循环中运行命令以分析整个数据资产库
该命令返回全面的指标,包括:
- 总存储大小:完整占用空间,包括所有数据、元数据和日志
- 活动数据:当前表版本的大小
- 可清空数据:可回收的空间
- 时间旅行数据:用于回滚的历史数据
有关完整的语法和示例,请参阅 COMPUTE STORAGE METRICS 。
使用预测优化来控制数据大小
Databricks 建议使用 Unity Catalog 托管表,后者启用了预测优化。 借助托管表和预测优化,Databricks 可以自动运行 OPTIMIZE 和 VACUUM 命令,以防止生成未使用的数据文件。 预测当前版本的表大小与云对象存储中数据文件的总大小之间始终存在差异。 这是因为当前版本中未引用的数据文件需要支持时间旅行查询。
VACUUM 报告哪些文件指标?
使用 VACUUM 清理未使用的数据文件或使用 DRY RUN 预览要删除的文件集时,指标将报告已删除的文件数和大小。
VACUUM 删除的文件的大小和数量会大不相同,但已删除文件的大小会超过当前版本表的总大小并不常见。
OPTIMIZE 报告哪些文件指标?
当 OPTIMIZE 在目标表上运行时,新数据文件会合并现有数据文件中的记录。 在 OPTIMIZE 期间提交的更改只会影响数据组织,并且不会对基础数据内容进行更改。 运行 OPTIMIZE 后,与表关联的数据文件的总大小会增加,因为新的压缩文件与不再引用的数据文件共存于包含目录中。
运行 OPTIMIZE 后报告的表大小通常小于运行 OPTIMIZE 前的大小,因为当前表版本引用的数据文件的总大小会随着数据压缩而减少。
VACUUM 必须在保留阈值通过后运行,这样才能删除基础数据文件。
注意
你可能会看到类似操作的指标,例如 REORG TABLE 或 DROP FEATURE。 需要重写数据文件的所有操作都会增加包含目录中的总数据大小,直到 VACUUM 删除当前表版本中不再引用的数据文件。