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

时间:2018-03-01 17:53:16

标签: java spring spring-boot spring-batch

要求是读取每个<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并继续提取数据而不是等到资源数组中填充所有资源。

另一个回顾我看到的是,持有S3ObjectStream,它将阻止我的请求池化从S3。

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

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

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

1 个答案:

答案 0 :(得分:0)

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