直接将流式数据导入BigQuery的优缺点与通过Google Pub/Sub + Dataflow导入的优缺点

22
我们在Google Kubernetes Engine上托管了一个NodeJS API,并希望开始将事件记录到BigQuery中。
我可以看到有三种不同的方法来实现这一目标:
  1. 使用Node BigQuery SDK中的API将每个事件直接插入BigQuery(如在“Streaming Insert Examples”下所述:https://cloud.google.com/bigquery/streaming-data-into-bigquery 或这里:https://github.com/googleapis/nodejs-bigquery/blob/7d7ead644e1b9fe8428462958dbc9625fe6c99c8/samples/tables.js#L367
  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
对于这个特定的用例,我们不需要进行任何转换,只需直接将事件发送到正确的格式中。但是,我们可能会有其他用例,需要将主数据存储(MySQL)中的表与BQ进行同步以进行分析,因此直接使用Dataflow开始也许是值得的?
一些问题:
1.如果您没有任何转换要做,则选项1(直接将单个事件发送到BQ)似乎最简单。它是否与发布到Pub / Sub主题一样快速和可靠?我主要关心延迟和错误/重复处理(https://cloud.google.com/bigquery/troubleshooting-errors#streaming)。也许这应该在单独的进程中完成?
2.对于选项2,是否有任何Dataflow“预设”,当您只需要从Pub / Sub读取+可靠地发送到BQ而无需进行任何转换(可能只是去重/错误处理)时,不需要编写自定义代码?
3.是否有任何缺点,如果有一个简单的自定义工作程序(选项3),它从Pub / Sub读取然后流式传输到BQ并执行所有错误处理/重试等操作?

5
如果不使用某种生产者/消费者模式(例如使用队列异步处理事件),Option 1将无法扩展。您也将无法正确地处理错误,即回退并重试。建议使用以下模式:应用程序 -> PubSub -> Dataflow(流处理)-> BigQuery。这是Google推荐的模式,也是最具容错性和可扩展性的模式。您还将连接Stackdriver日志记录到管道等。 - Graham Polley
3个回答

4
对于选项2,有一个名为Google提供的模板的预设,可以在不编写任何代码的情况下促进从PubSub到BigQuery的数据移动。
您可以在Cloud Dataflow文档中了解如何使用此Google提供的模板和其他模板。

3
我看了一下,感觉答案有些不够充分。以下是我对每种方法的优缺点:
1.编写自定义程序(通过Node BQ API或自定义工作进程)在确保仅一次性方面存在一些问题。具体来说,如果您编写自己的工作进程,则需要执行额外的工作以检查进度,并确保在运行时错误或工作进程死亡的情况下不会丢失或重复任何元素。
2.如果您的要求发生变化(例如,执行BQ流式插入变得过于昂贵),Dataflow的Java SDK可以无缝支持两个选项:流式插入或更便宜的将多个加载作业加载到BQ中而不是流式插入;它还能很好地处理多个数据源。
3.Dataflow提供自动扩展以应对数据量增加的情况。
基于这些,我会说:
  • 如果您的使用情况比较简单,并且可以接受在工作人员重新启动时非常少的数据点会被删除,那么自己编写的Node / Python应用程序应该适合您。

  • 如果您的使用情况仅涉及将PubSub流式传输到BQ,但必须确保不会丢失任何数据,请查看Andrew提供的模板,它正好可以做到这一点。

  • 如果您的使用情况可能比这更复杂,则可以考虑编写自己的管道(并使用模板代码作为灵感!)。


3
另一个选项是使用日志接收器导出日志。在 Stackdriver Logging UI 中,您可以指定 BigQuery(或其他目的地)来存储您的日志。由于您的 Node API 在 Kubernetes 中运行,所以只需要将消息记录到 stdout,它们就会自动写入 Stackdriver。
参考资料:https://cloud.google.com/logging/docs/export/configure_export_v2

这是一个有趣的想法。我仍然想知道成本如何与其他解决方案相比,但这确实是值得考虑的事情。 - Willian Fuks
这可能是最简单的开箱即用解决方案。主要成本是支付 Stackdriver Logging(存储)和创建 sinks 的任何额外费用(我没有看到任何定价信息)。我的初步感觉是,这比维护一个将流式写入 BigQuery 的流式 Dataflow 作业更便宜。Stackdriver Logging 有一个基本层,其中包含免费日志记录。Stackdriver 定价:https://cloud.google.com/stackdriver/pricing。 - Andrew Nguonly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接