繁体   English   中英

将内容从一个 s3 对象/文件夹移动到同一个存储桶中的另一个的最佳方法?

[英]Best way to move contents from one s3 object/folder to another within the same bucket?

我有一份工作需要将 ~150GB 从一个文件夹转移到另一个文件夹。 这每天运行一次。

def copy_new_data_to_official_location(bucket_name):
    s3 = retrieve_aws_connection('s3')
    objects_to_move = s3.list_objects(
        Bucket=bucket_name, Prefix='my/prefix/here')

    for item in objects_to_move['Contents']:
        print(item['Key'])
        copy_source = {
            'Bucket': bucket_name,
            'Key': item['Key']
        }

        original_key_name = item['Key'].split('/')[2]
        s3.copy(copy_source, bucket_name, original_key_name)

我有以下。 这个过程需要一些时间,而且,如果我没看错的话,我会支付在对象之间移动的转移费。

有没有更好的办法?

流动:

  1. 在 Spark 上运行大规模作业以从 folder_1 和外部源输入数据
  2. 将 output 复制到文件夹_2
  3. 删除 folder_1 中的所有内容
  4. 将文件夹_2 的内容复制到文件夹_1

以每日节奏重复上述流程。

Spark 有点奇怪,所以需要将 output 复制到 folder_2,否则重定向到 folder_1 会在作业开始之前导致数据擦除。

如果源存储桶和目标存储桶位于同一区域,则不收取数据传输费用。 由于您只是在同一个存储桶中复制,因此不会产生数据传输费用。

150 GB 不是很多数据,但是如果有很多对象,复制可能需要一些时间。 启动复制的开销有时会比实际复制数据花费更多的时间。 使用copy()命令时,所有数据都在 Amazon S3 中传输——没有任何内容被复制到发出命令的计算机。

有几种方法可以使这个过程更快:

  • 您可以并行发出copy()命令。 事实上,这就是AWS 命令行界面 (CLI)在使用aws s3 cp --recursiveaws s3 sync时的工作方式。

  • 您可以使用 AWS CLI来复制对象,而不是编写自己的程序。

  • 您可以在 Amazon S3 中配置复制,以便在创建对象后立即复制对象,而不是每天复制一次对象。 (虽然我没有尝试过使用相同的源和目标存储桶。)

  • 如果您需要对立即复制的对象更有选择性,您可以将 Amazon S3 配置为在创建新 object 时触发 AWS Lambda function Lambda function可以应用一些业务逻辑来确定是否复制object,然后它可以发出copy()命令。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM