Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark EMR和S3上的Delta Lake(OSS)表-真空需要很长时间没有作业_Apache Spark_Amazon S3_Pyspark_Amazon Emr_Delta Lake - Fatal编程技术网

Apache spark EMR和S3上的Delta Lake(OSS)表-真空需要很长时间没有作业

Apache spark EMR和S3上的Delta Lake(OSS)表-真空需要很长时间没有作业,apache-spark,amazon-s3,pyspark,amazon-emr,delta-lake,Apache Spark,Amazon S3,Pyspark,Amazon Emr,Delta Lake,我正在使用开源版本将大量数据写入Databricks Delta lake,该版本在AWS EMR上运行,S3作为存储层。我在用电子病历 为了提高性能,我每隔一段时间都会压缩和清理表,就像这样: spark.read.format("delta").load(s3path) .repartition(num_files) .write.option("dataChange", "false&

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

为了提高性能,我每隔一段时间都会压缩和清理表,就像这样:

    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中删除10万个文件。然而,真空步骤需要非常长的时间。在此期间,作业似乎处于空闲状态,但每隔5-10分钟就会有一个小任务指示作业处于活动状态并正在执行某些操作。


我读过这篇文章,它似乎暗示这可能与拼花地板有关?但是我在delta端看不到任何选项来调整任何参数。

我还观察到delta真空命令非常慢。开源开发人员可能会受到限制,无法在repo中进行特定于AWS的优化,因为该库是跨平台的(需要在所有云上工作)

我注意到真空在局部甚至很慢。您可以克隆Delta repo,在本地计算机上运行测试套件,然后自己查看

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

假设您的目标是创建1GB文件。也许你有15000个单文件和20000个小文件。现在,压缩操作正在重写所有数据(因此压缩后需要清空所有35000个原始文件)。尝试重构代码,只压缩20000个小文件(因此真空操作只需要删除20000个文件)

真正的解决方案是构建一个针对AWS优化的真空命令。Delta Lake需要使用所有流行的云和本地文件系统。创建一个开源库应该很容易,它可以读取事务日志,找出需要删除的文件,执行文件删除API调用,然后向事务日志中写入符合增量的条目。也许我会进行回购;)

给你。作为旁注,在压缩时,您可以使用
合并
而不是
重新分区

编辑: 三角洲问题:
和PR:

在德尔塔拉克有关于这个问题的文件

问题陈述: Deltalake真空作业需要很长时间才能完成,因为下面的文件删除逻辑是连续的。deltalake(v0.6.1)的已知缺陷参考:

解决方案: Deltalake团队已经解决了这个问题&尚未发布稳定版本。拉取请求:

对于v0.6.x

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


通过此更改,真空作业期间支持并行删除文件。它加快了流程并缩短了执行时间

感谢您的回复。我将给coalesce一个机会,尽管稍后我将不得不重新平衡分区。我的想法是删除调用应该来自执行器,但它们似乎来自驱动程序(并且也是同步/阻塞的?),这导致了长时间的延迟。如果我加载
\u delta\u log/\u last\u checkpoint
文件,(比如
000[…]991.checkpoint.parquet
),对所有具有
deletionTimestamp
早于7天的文件进行筛选,以获取我要删除的底层拼花地板文件的
路径,然后使用
aws cli
将其删除,这会导致增量表出现问题吗?我还需要创建一个新的检查点文件(比如
000[…]992.checkpoint.parquet
)并覆盖
\u delta\u log/\u last\u checkpoint
文件,使其指向该文件吗?@Clay-这听起来是一个高层次的好方法。如果存在大量文件,则从CLI中删除所有文件的速度非常慢。对所有文件应用1天生命周期策略可能会更快。确实需要更好的解决方案,因为当前提供的速度非常慢。@Powers Yes CLI也非常慢,但我可以释放群集资源,只需使用bash脚本即可从S3中删除所有文件。我主要关心的是不损坏
delta\u日志
文件。我甚至需要担心创建一个新的
\u last\u checkpoint
或新的`delta\u log`json文件吗?我可以把这个问题单独提出来。在这里问这个问题: