使用Spring批处理从S3读取大文件的最佳方法

问题描述 投票:0回答:1

要求是读取每个<4GB的文件并将数据推送到其他位置。我通过扩展PathMatchingResourcePatternResolver类编写了我自己的getResources()实现,以便填充资源数组,如下所示:

@Override
public Resource[] getResources(String locationPattern) throws IOException {
    Set<Resource> resources = new HashSet<Resource>();
    AmazonS3 s3Client = streamingClient.getS3Client();
    for (S3ObjectSummary summary : S3Objects.withPrefix(s3Client, this.awsConfiguration.getS3Bucket(),
            this.awsConfiguration.getS3BucketKey())) {
        S3Object s3object = s3Client.getObject(new GetObjectRequest(this.awsConfiguration.getS3Bucket(), summary.getKey()));
        resources.add(new S3Resource(summary.getKey(), s3object.getObjectContent()));
    }
    return resources.toArray(new Resource[resources.size()]);
}

如您所见,我读取了所有资源并构建了一个Resource数组并将其返回。我认为这是个坏主意,而不是我更喜欢将流传递给somethread并继续提取数据而不是等到所有资源都填充在Resource数组中。

我看到的另一个缺点是,持有S3ObjectStream,它将阻止我从S3获取池请求。

有没有其他方法可以用来构建读者?

下面是数据格式,A1有1k +文件,A2有1k +文件,每个大小<4GB。

<bucket> `--- A1/ `--- file1.txt `---- file2.txt `---A2/ `----- file3.txt ........... 任何帮助将不胜感激

java spring spring-boot spring-batch
1个回答
0
投票

已经有一种获取S3存储桶中的资源列表的方法。 Spring Cloud AWS提供了一个处理此问题的S3Resource实现,因此您无需读取整个资源即可获取资源列表。我在这里找到的S3JDBC示例中使用它:https://github.com/mminella/s3jdbc

© www.soinside.com 2019 - 2024. All rights reserved.