【发布时间】: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