0

我正在开发 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

在这种情况下,如果 ins3://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 在源存储桶上创建这个新文件?

4

1 回答 1

0

这些"_$folder$"文件是占位符。当您使用 -mkdir 命令在 S3 存储桶中创建文件夹时,Apache Hadoop 会创建这些文件。在您放置第一个对象之前,Hadoop 不会创建文件夹。如果"_$folder$"在 PUT 至少一个对象之前删除文件,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$" \ ;
于 2019-12-05T05:13:27.287 回答