EMR 和 S3 上的 Delta Lake (OSS) Table - Vacuum 需要很长时间,没有工作

Delta Lake (OSS) Table on EMR and S3 - Vacuum takes a long time with no jobs

我正在使用开源版本将大量数据写入 Databricks Delta lake,运行 在 AWS EMR 上使用 S3 作为存储层。我正在使用 EMRFS。

为了提高性能,我经常像这样压缩和清理 table:

    spark.read.format("delta").load(s3path)
            .repartition(num_files)
            .write.option("dataChange", "false").format("delta").mode("overwrite").save(s3path)
    
    t = DeltaTable.forPath(spark, path)
    t.vacuum(24)

然后它从 S3 中删除了 100k 的文件。然而,真空步骤需要极长的时间。在此期间,作业似乎处于空闲状态,但每隔约 5-10 分钟就会有一个小任务表明作业处于活动状态并正在做某事。

我通读了这个 post 这似乎暗示它可能与镶木地板有关?但是我在 delta 端没有看到任何选项来调整任何参数。

我还观察到 Delta vacuum 命令非常慢。开源开发人员可能无法在存储库中进行 AWS 特定优化,因为该库是跨平台的(需要在所有云上工作)。

我注意到 vacuum 在本地甚至很慢。您可以克隆 Delta 存储库,运行 本地计算机上的测试套件,并亲自查看。

删除存储在 S3 中的数十万个文件很慢,即使您使用的是 AWS CLI。您应该看看是否可以重构压缩操作以创建更少的需要清理的文件。

假设您的目标是创建 1GB 的文件。也许您有 15,000 个 one-gig 文件和 20,000 个小文件。现在,您的压缩操作正在重写所有数据(因此需要清理所有 35,000 个原始文件 post-compaction)。尝试重构您的代码以仅压缩 20,000 个小文件(因此 vacuum 操作只需要删除 20,000 个文件)。

真正的解决方案是构建一个针对 AWS 优化的 vacuum 命令。 Delta Lake 需要与所有流行的云和本地文件系统一起工作。制作一个读取事务日志的开源库应该很容易,找出需要删除的文件,进行高效的文件删除 API 调用,然后将一个条目写入事务日志,即 Delta合规。也许我会做那个 repo ;)

这里是more info on the vacuum command. As a sidenote, you may way to use coalesce instead of repartition when compacting, as described here

编辑: 增量问题:https://github.com/delta-io/delta/issues/395 和公关:https://github.com/delta-io/delta/pull/416

在 deltalake 中为此提交了问题

问题陈述: Deltalake 真空作业需要很长时间才能完成,因为下面的文件删除逻辑是顺序的。 deltalake (v0.6.1) 的已知错误参考:https://github.com/delta-io/delta/issues/395

解决方法: Deltalake 团队已经解决了这个问题并且还没有发布稳定版本。拉取请求:https://github.com/delta-io/delta/pull/522

对于 v0.6.x

很多组织在生产中使用 0.6.x,并希望它成为 0.6.x 的一部分。以下是使用此补丁生成 delta 0.6.1 jar 的快速步骤

https://swapnil-chougule.medium.com/delta-with-improved-vacuum-patch-381378e79d1d

通过此更改,支持在 vacuum 作业期间并行删除文件。它加快了进程并减少了执行时间