如何防止在 Azure Databricks 中删除 Delta Lake 检查点?

时间:2021-03-18 13:22:24

标签: databricks azure-databricks delta-lake

我注意到我在 delta Lake 文件夹中只有 2 个检查点文件。每 10 次提交,就会创建一个新的检查点,并删除最旧的检查点。

例如今天早上,我有 2 个检查站:340 和 350。我可以从 340 到 359 进行时间旅行。

现在,在“写入”操作之后,我有 2 个检查点:350 和 360。我现在可以从 350 到 360 进行时间旅行。 什么可以删除旧的检查点?我怎样才能防止这种情况发生?

我使用的是 Azure Databricks 7.3 LTS ML。

2 个答案:

答案 0 :(得分:1)

执行时间旅行的能力与检查站没有直接关系。检查点只是一种优化,它允许快速访问作为 Parquet 文件的元数据,而无需扫描单个事务日志文件。 This blog post 在 more details 中描述事务日志的详细信息

提交历史默认保留 30 天,并且可以按照 documentation 中的描述进行自定义。请注意,vacuum 可能会删除提交日志中仍引用的已删除文件,因为默认情况下数据仅保留 7 天。所以最好检查一下相应的设置。

如果您执行以下测试,则可以看到您拥有 10 个以上版本的历史记录:

df = spark.range(10)
for i in range(20):
  df.write.mode("append").format("delta").save("/tmp/dtest")
  # uncomment if you want to see content of log after each operation
  #print(dbutils.fs.ls("/tmp/dtest/_delta_log/"))

然后检查日志中的文件 - 您应该看到单个事务的检查点和文件:

%fs ls /tmp/dtest/_delta_log/

还要检查历史记录 - 您应该至少有 20 个版本:

%sql

describe history delta.`/tmp/dtest/`

你应该可以进入早期版本:

%sql

SELECT * FROM delta.`/tmp/dtest/` VERSION AS OF 1

答案 1 :(得分:1)

如果您想将检查点保留 X 天,您可以通过这种方式将 delta.checkpointRetentionDuration 设置为 X 天:

spark.sql(f"""
        ALTER TABLE delta.`path`
            SET TBLPROPERTIES (
                delta.checkpointRetentionDuration = 'X days'
            )
        """
)