【问题标题】:How to download and process large S3 file?如何下载和处理大型 S3 文件?
【发布时间】:2019-08-14 01:08:23
【问题描述】:

我在 S3 中有一个大的 JSON 文件(即 100MB 到 3GB)。如何处理这个? 今天我使用s3client.getObjectContent()获取输入流并尝试处理。

在流式传输时,我将 inputstream 传递给 Jackson jsonparser 并获取每个 JSON 对象并调用另一个微服务来处理从 s3 输入流中检索到的 JSON 对象。

问题:

当我处理 JSON 对象时,S3 流正在关闭,而不处理来自 S3 的整个有效负载。

我收到警告:

S3AbortableInputStream:并非所有字节都从 S3ObjectInputStream 中读取,正在中止 HTTP 连接

我正在寻找一种方法来处理大型 S3 有效负载,而无需 S3 客户端在我处理整个有效负载之前关闭流。任何最佳做法或见解都值得赞赏。

约束:我需要将其作为流处理或占用最少的内存。

【问题讨论】:

  • 您是否考虑过先下载整个文件,然后在本地处理?
  • 处理是否存在实际问题,或者您只是收到警告?在很多情况下,可以安全地忽略这个警告,它只是意味着一个 HTTP 连接不能被重用。有很多原因,流可能会在其中留下字节而关闭,例如获取对象以检查元数据以确定是否从缓存中提取它。分享您与流交互的代码可能会有所帮助。
  • 为什么要在 JSON 文件中存储多达 3GB 的空间?这似乎是一个有问题的设计。我不知道您的数据的形状,但也许您最好将这些项目存储在实际数据库(例如 MongoDB 或 DynamoDB)中?
  • 用比your previous 更少的信息问同样的问题不会给你更好的答案。 您需要调试为什么没有读取整个流。
  • @jarmod,从成本优化的角度来看,在 s3 中存储不会更改且需要经常获取的大数据是最好的选择。难怪我们为什么不能做 Dynamodb。但只有当数据经常更改/更新并需要查询时,这才是更好的选择。

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


【解决方案1】:

您能否在您的代码中进行以下更改并检查?

来自:

if (s3ObjectInputStream != null) {
                s3ObjectInputStream.abort();
            }

到:

if (s3ObjectInputStream == null) {
                s3ObjectInputStream.abort();
            }

【讨论】:

  • 我不认为这是你想要做的。这将始终抛出 NullPointerException。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 2020-05-14
  • 2017-01-30
  • 2010-11-06
相关资源
最近更新 更多