S3DistCp (AWS-EMR) - deleteOnSuccess 选项在源存储桶上创建文件



我正在处理AWS-EMR集群,并添加了一个运行S3DISTCP的步骤(https://docs.aws.amazon.com/es_es/emr/latest/ReleaseGuide/UsingEMR_s3distcp.html(,这是为了从s3存储桶复制对象(目标/目标也是s3存储桶(。

对象将正确复制到目标存储桶,并使用--deleteOnSuccess选项复制的对象按预期从源存储桶中删除。这里的问题是,对于包含复制对象的每个文件夹(在源存储桶上(,都会在源存储桶的根目录下创建一个新文件(这仅在--deleteOnSuccess选项中发生(。

我使用的参数是:

s3-dist-cp --s3Endpoint=s3.amazonaws.com --src=s3://MY_SOURCE_BUCKET/ --dest=s3://MY_DESTINATION_BUCKET/ --srcPrefixesFile=s3://ANOTHER_BUCKET/objects_list.txt --deleteOnSuccess

在这种情况下,如果在s3://MY_SOURCE_BUCKET/包含:

s3://MY_SOURCE_BUCKET/
|--folder_a/
|      |------ a.txt
|      |------ b.txt
|      |------ c.txt
|--folder_b/
|------ d.txt

如果我只想复制和删除s3://MY_SOURCE_BUCKET/folder_a/b.txt,一旦S3DISTCP运行完成,源桶如下所示:

s3://MY_SOURCE_BUCKET/
|--folder_a_$folder$    <-- This is the new file created with `_$folder$` suffix
|--folder_a/
|      |------ a.txt
|      |------ c.txt
|--folder_b/
|------ d.txt

有没有办法避免这些新文件是由源存储桶上的S3DISTCP创建的?

"_$folder$"文件是占位符。当您使用 -mkdir 命令在 S3 存储桶中创建文件夹时,Apache Hadoop 会创建这些文件。Hadoop 不会创建文件夹,直到你 PUT 第一个对象。如果在 PUT 至少一个对象之前删除"_$folder$"文件,Hadoop 将无法创建该文件夹。这会导致"没有这样的文件或目录"错误。截至目前,在使用 EMR 时无法阻止生成此文件。

删除这些文件是安全的。您可以通过运行如下所示的命令或创建 lambda s3 触发器来查找这些文件并定期删除它们来手动删除它们。但是在复制数据时删除它们可能会导致问题。请参阅此 [https://aws.amazon.com/premiumsupport/knowledge-center/emr-s3-empty-files/] 链接以了解更多信息。

read s3path; 
aws s3 rm --dryrun s3://$s3path/ 
--recursive 
--exclude '*' 
--include "*_$folder$"  ;

最新更新