【问题标题】:Cloud storage build file in chunk块中的云存储构建文件
【发布时间】:2021-06-19 04:57:52
【问题描述】:

寻找有关如何在云存储中动态构建文件的示例。以下是我的用例:

  1. Java 应用程序将查询大查询以获取数据
  2. 大查询使用分页,分页拉取数据
  3. 从 BQ 获得数据后,会将每个块保存在云存储中。
  4. 上传所有块后,完成文件上传。

这里的挑战是云存储文件是不可变的,所以一旦你在 GCS 中创建了对象,你就不能再重新打开它,除非你覆盖同一个文件。 尝试使用流媒体和resumable upload 功能进行探索,根据我的理解,它需要在上传之前准备好文件。

如果这是不可能的,我现在唯一的选择是将每个块上传为不同的文件,并使用云存储组合功能将这些块合并到一个文件中。这是非常昂贵的,因为您需要向 GCS 创建多个请求才能完成一个文件。

【问题讨论】:

  • 为什么您认为由多个部分组成一个 Cloud Storage 对象“成本很高”?那是最好的方法。 10,000 次 A 类 API 操作的成本是 5 美分。
  • @JohnHanley 基于 github 中的此评论,github.com/googleapis/gcs-resumable-upload/issues/…
  • 管理定价很重要。试图节省 5/1000 美分,然后在软件工程上花费数千美元来实现这些节省。从技术上讲,对于大于几百兆字节的文件,使用对象组合远优于单个多部分上传。
  • 是的,定价对我们来说非常重要,因为有大量用户试图访问我们的应用程序并每次执行此操作都会产生复合成本。同意,最好以较小的部分上传,而不是在一个上传请求中删除整个文件。

标签: java google-cloud-platform google-cloud-storage


【解决方案1】:

如果您的最终文件格式是 CSV、JSONL(行)、AVRO 或 Parquet,您可以使用表格导出功能。如果导出小于 1Gb,则只会生成一个文件。

  • Java 应用程序查询 BigQuery 并将结果存储到临时表中
CREATE TABLE `myproject.mydataset.mytemptable`
OPTIONS(
  expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)
) AS
SELECT ....

就是这样。

【讨论】:

  • 是的,这是我最初的实现,但尽量不要过度依赖大查询。这在技术上是正确的,但我正在寻找其他选择。
  • 如果你想成为最高效的(在性能和成本方面(因为你付出了你的处理时间,你的效率更高,你需要的处理能力更少,它更便宜)),你需要坚持使用云提供商工具和最佳实践。如果您自己构建一个类似(且优化程度较低)的解决方案(除了开发和维护成本),您将无法像 BigQuery 一样高效。
猜你喜欢
  • 2014-07-20
  • 2015-05-18
  • 2017-11-22
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多