通过Google Pub / Sub + Dataflow直接流入BigQuery的优缺点

时间:2018-01-11 18:03:01

标签: google-bigquery google-cloud-dataflow google-cloud-pubsub

我们在Google Kubernetes Engine上托管了一个NodeJS API,我们想开始将事件记录到BigQuery中。

我可以看到3种不同的方法:

  1. 使用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)< / LI>
  2. 将每个事件发布到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
  3. 将每个事件从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
  4. 对于这个特定用例,我们不需要进行任何转换,只会将事件直接发送到正确的格式。但是我们稍后可能会有其他用例,我们需要将主数据存储区(MySQL)中的表同步到BQ进行分析,所以可能马上从Dataflow开始是值得的吗?

    几个问题:

    • 如果您没有要进行任何转换,选项1(将单个事件直接发送到BQ)似乎最简单。它是否同样快速和可靠 发布到Pub / Sub主题?我主要关注延迟 和错误/重复处理 (https://cloud.google.com/bigquery/troubleshooting-errors#streaming)。 也许这在单独的过程中做得更好?
    • 对于选项2,是否有任何数据流“预设”不需要您编写自定义代码,只需要从Pu​​b / Sub读取+可靠地发送到BQ而不进行转换(可能只是重复数据删除/错误处理)
    • 有一个简单的自定义工作程序(选项3)是否有任何缺点,从Pub / Sub读取然后流入BQ并执行所有错误处理/重试等?

3 个答案:

答案 0 :(得分:4)

对于选项2,是的,有一个名为Google提供的模板的预设,可以方便地将数据从PubSub移动到BigQuery,而无需编写任何代码。

您可以在Cloud Dataflow documentation中详细了解如何使用此Google提供的模板及其他模板。

答案 1 :(得分:3)

另一种选择是使用日志接收器导出日志。从Stackdriver Logging UI开始,您可以为日志指定BigQuery(或其他目标)。由于您的Node API在Kubernetes中运行,您只需要将消息记录到stdout,它们将自动写入Stackdriver。

参考:https://cloud.google.com/logging/docs/export/configure_export_v2

答案 2 :(得分:0)

我看了一下,感觉好像缺少答案。这是我可以告诉您的每种方法的优缺点:

  1. (通过Node BQ API或自定义工作进程)编写自定义程序在一次保证时遇到了一些陷阱。具体来说,如果您编写自己的工作程序,则将需要执行额外的工作以检查检查点的进度,并确保在运行时错误或工作程序进程快死的情况下,不要删除或重复任何元素。

  2. 如果您的需求发生变化(例如执行BQ流插入变得过于昂贵),Dataflow的Java SDK无缝支持以下任一选项:流插入,或将便宜的多个加载作业插入BQ而不是流插入;并且还可以很好地处理多个数据源。

  3. 数据流可自动缩放,以防您的数据量增加。

考虑到这一点,我会说:

  • 如果您的用例相对简单,并且可以在工作线程重新启动时删除非常罕见的数据点,那么您可以使用定制的Node / Python应用程序来解决问题。

    < / li>
  • 如果您的用例仅涉及将PubSub流式传输到BQ,但是您必须确保没有丢失任何数据,请检查执行此操作的Template provided by Andrew

  • 如果用例可能比这更复杂,则可以考虑编写自己的管道(并使用Template code as inspiration!)。