【发布时间】:2018-06-21 03:37:33
【问题描述】:
我们在 Google Kubernetes Engine 上托管了一个 NodeJS API,我们希望开始将事件记录到 BigQuery 中。
我可以看到 3 种不同的方法:
- 使用 API 中的 Node BigQuery SDK 将每个事件直接插入 BigQuery(如“流式插入示例”下所述:https://cloud.google.com/bigquery/streaming-data-into-bigquery 或此处:https://github.com/googleapis/nodejs-bigquery/blob/7d7ead644e1b9fe8428462958dbc9625fe6c99c8/samples/tables.js#L367)
- 将每个事件发布到 Cloud Pub/Sub 主题,然后编写 Cloud Dataflow 管道以将其流式传输到 BigQuery(似乎仅在 Java 或 Python 中),例如此处 https://blog.doit-intl.com/replacing-mixpanel-with-bigquery-dataflow-and-kubernetes-b5f844710674 或此处 https://github.com/bomboradata/pubsub-to-bigquery
- 通过 API 将每个事件发布到 Pub/Sub 主题,但使用自定义工作进程代替 Dataflow,该进程一方面订阅 Pub/Sub 主题,另一方面将流式传输到 BQ。像这儿 : https://github.com/GoogleCloudPlatform/kubernetes-bigquery-python/blob/master/pubsub/pubsub-pipe-image/pubsub-to-bigquery.py 或在这里:https://github.com/mchon89/Google_PubSub_BigQuery/blob/master/pubsub_to_bigquery.py
对于这个特定的用例,我们不需要进行任何转换,只需将事件直接发送到正确的格式。但是我们以后可能会有其他用例,我们需要将表从我们的主数据存储 (MySQL) 同步到 BQ 以进行分析,所以也许直接从 Dataflow 开始是值得的?
几个问题:
- 选项 1(将单个事件直接发送到 BQ)似乎是最简单的,如果您没有任何转换要做。是否和它一样快速和可靠 发布到 Pub/Sub 主题?我主要关心延迟 和错误/重复处理 (https://cloud.google.com/bigquery/troubleshooting-errors#streaming)。 也许这最好在一个单独的过程中完成?
- 对于选项 2,是否有任何数据流“预设”不需要您编写自定义代码,而您只需从 Pub/Sub 读取 + 可靠地发送到 BQ 而不进行任何转换(可能只是重复数据删除/错误处理)
- 让一个简单的自定义工作程序(选项 3)从 Pub/Sub 读取然后流入 BQ 并执行所有错误处理/重试等是否有任何缺点?
【问题讨论】:
-
如果没有某种生产者/消费者模式,即使用队列异步处理事件,选项 1 将无法扩展。您也将无法正确处理错误,即后退和重试。使用:
App -> PubSub -> Dataflow (streaming) -> BigQuery。这是 Google 推荐的模式,也是最具容错性和可扩展性的模式。您还将获得连接到管道等的 Stackdriver 日志记录。
标签: google-bigquery google-cloud-dataflow google-cloud-pubsub