【问题标题】:Download from Google Cloud Storage Java APIs slower than gsutil从 Google Cloud Storage Java API 下载比 gsutil 慢
【发布时间】:2019-03-14 23:47:27
【问题描述】:

我在使用 Java 中的 Google Cloud Storage API 时遇到了问题。以下所有情况都发生在 GCP 实例上——所以这一切都在 Google 的网络中。基本上,对于下载大型 zip 文件,gsutil 非常快,但执行类似任务的 Java 代码非常慢,可能慢了 10 倍。作为参考,这将是等效的 gsutil 命令。

gsutil cp gs://mybucket/myfile.zip .

非常基本,没有疯狂的选择。但是,应该或多或少做同样事情的 Java 代码要慢得多:

        FileOutputStream fos = new FileOutputStream("myfile.zip");
        Storage.Objects.Get get = storageService.objects().get("mybucket", "myfile.zip");
        get.setDisableGZipContent(true); //Seems to have no effect
        MediaHttpDownloader downloader = get.getMediaHttpDownloader();
        downloader.setDirectDownloadEnabled(true); //Seems to have no effect
        get.executeMediaAndDownloadTo(fos);

我不明白为什么这非常慢。作为一个愚蠢但悲伤的测试来解决这个问题,我在另一个终端窗口中执行了gsutil,而 Java 代码仍在运行,gsutil 在 Java 代码之前几秒钟下载了相同的文件。只是慢得令人尴尬。这些是我从 Google 使用的库:

    <dependency>
        <groupId>com.google.api-client</groupId>
        <artifactId>google-api-client</artifactId>
        <version>1.21.0</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>com.google.apis</groupId>
        <artifactId>google-api-services-storage</artifactId>
        <version>v1-rev66-1.21.0</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>com.google.http-client</groupId>
        <artifactId>google-http-client</artifactId>
        <version>1.21.0</version>
        <scope>compile</scope>
    </dependency>

我已尝试更改 setDirectDownloadEnabled()setDisableGZipContent() 的选项(因为我们正在下载一个 zip,它已经被压缩) - 没有任何明显的效果。

【问题讨论】:

  • 你能量化“极慢”吗?下载一个 100 兆字节的对象需要多少秒? gsutil 需要多长时间?
  • 我见过 500MB 的速度慢到 70 秒。 gsutil 大约 2-3 完成。

标签: java google-cloud-storage


【解决方案1】:

gsutil 更快的主要原因有两个:

  1. MediaHttpDownloader 下载字节块,默认为一次32MB。因此,在每 32MB 之间,客户端等待服务响应时需要额外的往返。

  2. 默认情况下,gsutil 将对象拆分为 multiple slices 并并行下载每个切片。这绕过了任何单流带宽或连接限制。

由于您的代码在 GCP 内部,因此网络应该不是一个因素(但它仍然是一个因素)。不过,我认为这并不能解释 10 倍的降级,因此澄清您所看到的确切传输速率会很有用。

【讨论】:

  • 1) 直接下载应该尝试将整个内容作为一个请求下载。 2)从他们的文档中“使用切片对象下载也需要编译的 crcmod”——我没有安装这个(我收到关于它的警告),所以不可能是切片下载正在发生。
  • 我同意 1),但我认为这是 App Engine 的限制。无论如何,尤其是由于没有使用分片下载,这并不能解释如此巨大的性能差异。
  • 你指的是哪一点(答案和cmets都有不同的“第二点”),为什么错了?
猜你喜欢
  • 2014-09-21
  • 2021-12-23
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
  • 2014-10-17
  • 2019-08-06
  • 2020-01-11
相关资源
最近更新 更多