【问题标题】:How to copy large amount of files from S3 folder to another如何将大量文件从 S3 文件夹复制到另一个文件夹
【发布时间】:2019-10-09 02:00:15
【问题描述】:

我正在尝试将大量文件(每个文件最大大小约为 300Kb)从 S3 文件夹移动到另一个文件夹。

我正在使用 AWS sdk for java,并尝试移动大约 1500 个文件。

时间太长,文件数可能会增加到10,000个。

对于文件的每个副本,由于无法移动文件,需要从源文件夹中删除。

这是我尝试过的:

public void moveFiles(String fromKey, String toKey) {
    Stream<S3ObjectSummary> objectSummeriesStream = this.getObjectSummeries(fromKey);
    objectSummeriesStream.forEach(file ->
        {
            this.s3Bean.copyObject(bucketName, file.getKey(), bucketName, toKey);
            this.s3Bean.deleteObject(bucketName, file.getKey());
        });

}

private Stream<S3ObjectSummary> getObjectSummeries(String key) {

    // get the files that their prefix is "key" (can be consider as Folders).
    ListObjectsRequest listObjectsRequest = new ListObjectsRequest().withBucketName(this.bucketName)
        .withPrefix(key);
    ObjectListing outFilesList = this.s3Bean.listObjects(listObjectsRequest);
    return outFilesList.getObjectSummaries()
        .stream()
        .filter(x -> !x.getKey()
            .equals(key));
}

【问题讨论】:

  • 您是从 java 应用程序还是从 AWS-Lambda 运行此代码?
  • @alexey28 目前没有计划将此应用程序放在 Lambda 上。
  • 这是一次性工作,还是会有更多需要移动的对象到达 Amazon S3?如果会有更多,Lambda 是有道理的。如果是一次性的,您可以使用AWS Command-Line Interface (CLI) aws s3 mv 命令。
  • @JohnRotenstein 这不是一次性的工作。这是日常过程。在这种情况下,Lambda 对我没有帮助,因为在我处理之前我无法将文件移动到另一个文件夹。我需要一起处理它们,它们不是独立的。

标签: java amazon-s3 aws-java-sdk


【解决方案1】:

如果您使用的是 Java 应用程序,您可以尝试使用多个线程来复制文件:

private ExecutorService executorService = Executors.fixed(20);

public void moveFiles(String fromKey, String toKey) {
    Stream<S3ObjectSummary> objectSummeriesStream = 
    this.getObjectSummeries(fromKey);
    objectSummeriesStream.forEach(file ->
    {
        executorService.submit(() ->
            this.s3Bean.copyObject(bucketName, file.getKey(), bucketName, toKey);
            this.s3Bean.deleteObject(bucketName, file.getKey());
        )};
    });

}

这应该会加快这个过程。

另一种方法可能是使用 AWS-lambda。例如,一旦文件出现在源存储桶中,您就可以将事件放入 SQS FIFO 队列。 lambda 将通过此事件启动单个文件复制。如果我没记错的话,您最多可以启动 500 个 lambda 实例。应该很快。

【讨论】:

  • 谢谢!我会尝试第一个灵魂。顺便说一句,如果将它放在 lambda 上,则 lambda 的触发器可以通过 S3 而不是 SQS。问题是这段代码是在一些业务逻辑之后运行的,该逻辑应该处理所有文件,而不是将它们移动到另一个文件夹。
  • 在这种情况下,您可以:1) 将业务逻辑放入 lambdas 或 2) 业务逻辑完成后将具有已处理文件名的消息放入 FIFO 队列并通过此消息触发 lambda 文件复制
  • 可以压缩一组文件,传输后再解压吗?
  • @rossumy 这些文件不在操作系统上。它们位于 S3 中。为了压缩,我需要下载它们,给应用程序写权限。另外,如何在 S3 中解压?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 2023-01-14
  • 2018-05-20
  • 1970-01-01
相关资源
最近更新 更多