将大量数据从一个 Amazon S3 存储桶传输到另一个存储桶的最佳方法是什么?

上次更新时间:2021 年 5 月 27 日

我想要将大量数据(1 TB 或以上)从一个 Amazon Simple Storage Service (Amazon S3) 存储桶传输到另一个存储桶。该如何操作?

简短描述

根据您的使用案例,您可以通过以下选项之一在存储桶之间执行数据传输:

  • 使用 AWS 命令行界面 (AWS CLI) 并行上传
  • 使用 AWS 开发工具包
  • 使用跨区域复制或同一区域复制
  • 使用 Amazon S3 批处理操作
  • 结合使用 S3DistCp 与 Amazon EMR
  • 使用 AWS DataSync

解决方法

使用 AWS CLI 并行上传

注意:作为一项最佳实践,请确保您使用的是最新版本的 AWS CLI。有关更多信息,请参阅安装 AWS CLI

您可以将传输过程拆分为多个互相独立的操作,以通过多线程缩短传输时间。例如,您可以使用 AWS CLI 并行运行 aws s3 cpaws s3 mvaws s3 sync 的多个实例。您可以在将 --exclude 和 --include 参数用于 AWS CLI 的每个实例时创建更多上传线程。这些参数按文件名称筛选操作。

注意:--exclude--include 参数会在客户端处理。因此,本地计算机的资源可能会影响操作性能。

例如,要将大量数据从一个存储桶复制到另一个存储桶,并且其中的所有文件名均以数字开头,您可以在 AWS CLI 的两个实例上运行以下命令。首先,运行此命令来复制名称以数字 0 到 4 开头的文件:

aws s3 cp s3://source-awsexamplebucket/ s3://destination-awsexamplebucket/ --recursive --exclude "*" --include "0*" --include "1*" --include "2*" --include "3*" --include "4*"

注意:如果在运行 AWS CLI 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

然后,运行此命令来复制名称以数字 5 到 9 开头的文件:

aws s3 cp s3://source-awsexamplebucket/ s3://destination-awsexamplebucket/ --recursive --exclude "*" --include "5*" --include "6*" --include "7*" --include "8*" --include "9*"

此外,您可以自定义以下 AWS CLI 配置来加快数据传输:

  • multipart_chunksize:此值设置 AWS CLI 在单个文件的分段上传中上传的每个部分的大小。通过此设置,您可以将较大的文件(例如 300 MB)分解为较小的部分,以加快上传速度。
    注意:分段上传要求单个文件上传时所分的不同部分不超过 10000 个。您必须确保您所设置的区块大小平衡了各部分文件大小和部分数量。
  • max_concurrent_requests:此值用于设置一次可以发送至 Amazon S3 的请求数量。默认值为 10。您可以将该值增大到更高的值,如 50。
    注意:运行的线程越多,消耗的计算机资源也越多。您必须确保您的计算机拥有足够的资源来支持您想要的最大并发请求数。

使用 AWS 开发工具包

考虑使用 AWS 开发工具包构建自定义应用程序,以对大量对象执行数据传输。虽然 AWS CLI 可以执行复制操作,但自定义应用程序在执行数亿对象的传输时更为高效。

使用跨区域复制或同一区域复制

当您在源存储桶上设置跨区域复制 (CRR) 或同一区域复制 (SRR) 后,Amazon S3 会将新对象从源存储桶同步和异步复制到目标存储桶中。您可以使用前缀或标签筛选复制哪些对象。有关配置复制和指定筛选条件的更多信息,请参阅复制配置概述

配置好复制后,只有新对象才会复制到目标存储桶中。现有对象不会复制到目标存储桶中。要复制现有对象,您可以在源存储桶上设置复制后运行以下 cp 命令

aws s3 cp s3://source-awsexamplebucket s3://source-awsexamplebucket --recursive --storage-class STANDARD

此命令会将源存储桶中的对象复制回源存储桶中,从而触发至目标存储桶的复制。

注意:最佳做法是在非生产环境中测试 cp 命令。这样做可让您为您的确切使用案例配置参数。

使用 Amazon S3 批处理操作

您可以使用 Amazon S3 批处理操作来通过单一请求复制多个对象。当您创建批处理操作作业时,您可以使用 Amazon S3 库存报告指定在哪些对象上执行此操作。或者,您可以使用 CSV 清单文件来指定批处理作业。然后,Amazon S3 批处理操作将调用 API 执行操作。

当批处理操作作业完成后,您将收到通知,且您可以选择接收作业的完成报告

结合使用 S3DistCp 与 Amazon EMR

Amazon EMR 上的 S3DistCp 操作可以在 Amazon S3 存储桶间执行大量对象的并行复制。S3DistCp 首先会将文件从源存储桶复制到 Amazon EMR 集群的工作线程节点中。然后,该操作会将文件从工作线程节点写入目标存储桶中。有关使用 S3DistCp 的更多指导,请参阅在 Amazon EMR 上使用 S3DistCp 以在 HDFS 与 Amazon S3 之间高效移动数据的七个提示

重要提示:由于此选项要求您使用 Amazon EMR,因此请务必查看 Amazon EMR 定价

使用 AWS DataSync

要将大量数据从一个 Amazon S3 存储桶移到另一个存储桶,请执行以下步骤:

1.    打开 AWS DataSync 控制台

2.    创建任务

3.    为 Amazon S3 创建新位置

4.    选择 S3 存储桶作为源位置。

5.    更新源位置配置设置。确保指定将用于访问源 S3 存储桶的 AWS Identity Access Management (IAM) 角色。

6.    选择 S3 存储桶作为目标位置。

7.    更新目标位置配置设置。确保指定将用于访问目标 S3 存储桶的 AWS Identity Access Management (IAM) 角色。

8.    为您的任务配置设置

9.    查看配置详细信息。

10.    选择 Create task (创建任务)

11.    开始任务

重要提示:使用 AWS DataSync 时,将产生额外费用。要预览任何 DataSync 成本,请查看 DataSync 定价结构和 DataSync 限制


这篇文章对您有帮助吗?


您是否需要账单或技术支持?