【问题标题】:Service to periodically load data to BigQuery定期将数据加载到 BigQuery 的服务
【发布时间】:2016-10-13 19:57:53
【问题描述】:

我注意到,我们在 Google BigQuery 上的项目计费主要由资源成本 StreamingBytes(占总成本的 90%)支配。这是因为我们使用insertAll() 方法一次流式传输一条记录。事实上,每天插入的数据量在 100GB 左右,但我们收取大约 10 倍(~1TB)的费用,因为 BigQuery 认为每行最小为 1KB,并且我们推送了许多小尺寸的行。

更改表的架构以使它们更“水平”将是降低成本的解决方案,但对于我们的管道设计方式来说并不方便。

相反,我们想利用这样一个事实,即从文件(POST 请求)或从 Google Cloud Storage 将数据加载到 BigQuery 是免费的,而且我们不需要立即访问数据。我们想要创建一个服务来“缓冲”来自不同机器(尤其是 Celery 工作人员)的行,并通过从文件加载定期将成批的行加载到 BigQuery。

第一个问题:是否已经有一项服务可以做到这一点?

在实现方面,我们考虑使用关系数据库(即 PostgreSQL)来存储缓冲数据,以便我们可以利用它处理并发事务的方式。对于这种用例来说,内存存储(如 Redis)太昂贵了。你能想出更好的解决方案吗?

我应该将数据存储在缓冲服务的什么位置?

【问题讨论】:

    标签: postgresql google-bigquery buffer bigdata


    【解决方案1】:

    听起来您想做的事情非常适合 Apache Beam/Google Cloud Dataflow。 Beam 非常适合获取记录的 PCollection 并将它们附加到 BigQuery 表中。例如,请参阅 Apache Beam github 存储库中的此示例: https://github.com/apache/incubator-beam/blob/python-sdk/sdks/python/apache_beam/examples/cookbook/bigquery_schema.py

    【讨论】:

    • 感谢您的回复,丹。我不确定我是否理解。在我的情况下,Beam 管道会做什么?我仍然需要某种共享文件系统或数据库来用作缓冲区,不是吗?
    • Beam 管道会协调从您暂存文件的任何位置加载文件。为简单起见,您可以在 Google Cloud PubSub 或 Google Cloud Storage 中暂存传入数据,前者可能最适合。这是一个celery-like and publishes to PubSub的项目。
    【解决方案2】:

    一种适合您情况的解决方案是名为 Alooma 的工具。

    它可以从 Google Cloud Storage 存储桶读取文件中的所有数据并将其复制到 BigQuery。您无需为此解决方案创建缓冲服务,您的数据将直接加载到 BigQuery 中

    https://www.alooma.com/integrations/to/bigquery

    您的 Google Cloud Storage 存储分区中的文件可以使用 Tar 或 GZip 打包和压缩,并且可以包含每行一个事件、单个 JSON 对象或 JSON 对象数组。

    查看此处以了解有关如何将 Google Cloud Storage 连接到 BigQuery 的更多信息:

    https://support.alooma.com/hc/en-us/articles/115001940489-Google-Cloud-Storage-integration

    完全披露:我曾经在 Alooma 担任软件工程师

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-24
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多