【问题标题】:Iterate Over Every Object Summary In Active S3 Bucket迭代活动 S3 存储桶中的每个对象摘要
【发布时间】:2021-06-21 22:12:56
【问题描述】:

我是一名对 AWS 和 S3 相当陌生的开发人员,我的任务是遍历大型活动 S3 存储桶中的每个对象,并对单个对象摘要执行处理,而不是对象本身。

S3 存储桶不断有新对象写入其中并读取现有对象,但没有发生删除或更新现有对象。我们可以假设到达 S3 的任何新对象都已被处理,因此我们只需要担心历史数据。处理已经处理过的数据并不是最优的,但如果没有有效的方法来解决它是可以接受的。新对象以未知的速率到达,该速率可能高于或低于单个线程生成ListObjectsV2Request、处理对象摘要和检索下一页结果的速率。

S3 存储桶中的对象数量约为 100 000 000(1 亿),对于单个 ListObjectsV2Request 请求来说太大了,如果所有对象摘要都可以可能 在单个请求中检索。

有什么方法可以对存储桶中的当前对象进行“快照”并对其进行处理?如果做不到这一点,AWS v2 SDK 支持的分页是在第一次请求发出时的“快照”上运行,还是会在第一次请求后将新对象写入存储桶时持续提供新对象?

即是否可以执行

ListObjectsV2Request request = new ListObjectsV2Request.withBucketName(myBucket).withMaxKeys(MAX_KEYS);
ListObjectsV2Result result;
do {
    result = s3Client.listObjectsV2(request);
    processObjectSummaries(result.getObjectSummaries());
    String continuationToken = result.getNextContinuationToken();
    request.setContinuationToken(token);
} while (result.isTruncated());

并以最少的新数据重新处理来处理我的历史数据?

【问题讨论】:

  • 如何使用对象的创建/修改日期过滤您的列表,与this answer 中的类似(但不完全相同)?
  • 考虑结合使用 S3 Inventory 来获取当前对象列表,并结合添加新对象时触发的 Lambda 函数。
  • 您使用的是旧 API。您应该考虑迁移到 Java API V2 S3 API。 github.com/awsdocs/aws-doc-sdk-examples/tree/master/javav2/…

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


【解决方案1】:

使用 S3 inventory 创建 S3 存储桶中所有对象的清单。

这使您可以获取 CSV、ORC 或 Parquet 文件,其中包含当前存储桶中所有对象的列表。然后,您可以使用 Python、Athena 或您选择的任何工具来处理该数据并进行聚合。

它最终是一致的,但它包含每个对象的 LastModified 时间戳,因此您可以使用截止日期来区分历史数据和您通过 SQS-Lambda 集成处理的任何数据。

如果您需要重新处理部分数据,您还应该知道S3 Batch operations,它可以帮助您。

【讨论】:

    猜你喜欢
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 2011-04-28
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多