2

我想实时(或接近实时)将 HTTP 请求流式传输到 BigQuery。

理想情况下,我想使用一个工具,该工具提供一个端点以将 HTTP 请求流式传输到并允许我编写简单的 Node,这样:1. 我可以添加适当的 insertId,以便 BigQuery 可以在必要时对请求进行重复数据删除 2. 我可以批处理数据,所以我一次不会发送一行(这会导致不必要的 GCP 成本)

我曾尝试使用 AWS Lambdas 或 Google Cloud Functions,但在这些平台上解决此问题的必要设置远远超出了此处用例的需求。我假设许多开发人员都有同样的问题,并且必须有更好的解决方案。

4

2 回答 2

2

您可以使用云功能。借助云函数,您可以在 Node JS 中创建自己的 API,然后将其用于 BQ 中的 Streaming 数据。

STREAM 的目标架构如下所示:Pubsub 订阅者(PUSH TYPE)-> Google Cloud Function -> Google Big Query

您可以在批处理模式下使用此 API,也可以在 Cloud Composer(即 Apache Airflow)或 Cloud Scheduler 的帮助下根据您的要求安排您的 API。

BATCH 的目标架构如下:Cloud Scheduler/Cloud Composer -> Google Cloud Function -> Google Big Query

于 2019-06-14T12:26:06.870 回答
1

由于您正在寻找一种将HTTP 请求流式传输到 BigQuery并批量发送它们以最小化 Google Cloud Platform 成本的方法,因此您可能需要查看解释此问题的公共文档。您还可以找到有关如何将流插入 BigQuery的 Node.js模板:

// Imports the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');

/**
* TODO(developer): Uncomment the following lines before running the sample.
*/
// const projectId = "your-project-id";
// const datasetId = "my_dataset";
// const tableId = "my_table";
// const rows = [{name: "Tom", age: 30}, {name: "Jane", age: 32}];

// Creates a client
const bigquery = new BigQuery({
    projectId: projectId,
});

// Inserts data into a table
await bigquery
    .dataset(datasetId)
    .table(tableId)
    .insert(rows);
console.log(`Inserted ${rows.length} rows`);

至于批处理部分,建议的比例是每个请求使用 500 行,即使它可以达到 10,000。有关流式插入的配额和限制的更多信息可以在公共文档中找到。

于 2019-06-14T09:58:14.053 回答