如何使作业幂等于多次运行在S3中生成相同的结果文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使作业幂等于多次运行在S3中生成相同的结果文件相关的知识,希望对你有一定的参考价值。

我使用spark df write将镶木地板文件保存到S3。场景:我运行Job1并将xyz.parquet保存到S3,我的Job2拿起xyz.parquet并将数据加载到DB。现在,我希望下次运行Job1时,它应生成xyz.parquet并将数据加载到DB。我的问题是,我无法覆盖镶木地板文件,我不想在保存新的xyz.parquet之前删除旧的xyz.parquet文件因为可能有新的xyz.parquet可能无法写入的机会不想失去我的旧xyz.parquet。我希望我的Job1是幂等的,这样我的Job2和其他工作就不需要改变了。一种方法是在时间戳附加的文件名的命名约定中。有没有更好的解决方案。

答案

一般工作流程从源目录dir重命名为dest。 S3的特殊之处在于,当您写入文件时,在调用文件close()之前,没有任何内容(可见)保存。也就是说:如果任何程序在覆盖文件中途失败,那么旧文件仍然存在。也许你可以将这个功能用于像这样的工作流程

  1. 使用输出s3://bucket/tmp/result.parquet运行查询
  2. 发出s3 HTTP请求PUT s3://bucket/final/result.parquet x-copy-source:s3://bucket/tmp/result.parquet

S3的Hadoop FS客户端都没有直接公开该复制命令,虽然重命名是这样做,但强制你先删除最后一个,所以那里有一个很小的漏洞

以上是关于如何使作业幂等于多次运行在S3中生成相同的结果文件的主要内容,如果未能解决你的问题,请参考以下文章

关于MQ的几件小事如何保证消息不重复消费

在laravel中生成视图时如何使php vars保持不变?

什么叫幂等?如何实现幂等性?

冥等性

proto 文件,在 python 中生成代码并运行

如何保证幂等?