当前位置: 首页 > 知识库问答 >
问题:

直接流入BigQuery与通过Google发布/订阅数据流流入BigQuery的利弊

彭成天
2023-03-14

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

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

  1. 使用API中的节点BigQuery SDK将每个事件直接插入BigQuery(如此处“流式插入示例”下所述):https://cloud.google.com/bigquery/streaming-data-into-bigquery或此处:https://github.com/googleapis/nodejs-bigquery/blob/7d7ead644e1b9fe8428462958dbc9625fe6c99c8/samples/tables.js#L367)

对于这个特定的用例,我们不需要进行任何转换,只需将事件直接发送到正确的格式。但是我们以后可能会有其他用例,我们需要将表从我们的主数据存储(MySQL)同步到BQ进行分析,所以也许立即从数据流开始是值得的?

几个问题:

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

共有3个答案

易炳
2023-03-14

我看了一下这个,觉得答案有些欠缺。以下是我可以告诉您的每种方法的优缺点:

>

如果您的需求发生变化(例如,执行BQ流式插入变得过于昂贵),Dataflow的JavaSDK无缝支持以下任一选项:流式插入,或者在BQ中执行多个加载作业而不是流式插入更便宜;它还可以处理多个数据源。

数据流提供自动缩放,以防您的数据量增加。

考虑到这一点,我想说:

>

  • 如果您的用例相对简单,并且您可以在工作线程重新启动时丢弃非常少的数据点,那么定制编写的节点/Python应用程序应该可以为您提供帮助。

    如果您的用例只涉及将PubSub流式传输到BQ,但您必须确保没有数据被丢弃,请查看Andrew提供的模板,该模板正是这样做的。

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

  • 霍锦
    2023-03-14

    另一种选择是使用日志接收器导出日志。您可以直接从堆栈驱动程序日志记录UI为您的日志指定BigQuery(或其他目的地)。由于您的节点API在库伯内特斯中运行,您只需要将消息记录到stdout,它们就会自动写入堆栈驱动程序。

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

    丰胤运
    2023-03-14

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

    您可以在Cloud Dataflow留档中了解有关如何使用此Google提供的模板和其他模板的更多信息。

     类似资料:
    • 我有一个简单的流程,目的是在一个BigQuery表中写两行。我使用动态目标,因为之后我将在多个表上写,在那个例子中是同一个表...问题是我的BigQuery表最后只有一行。在第二次插入时,我看到以下错误 "状态:{code: 6 消息:"已存在:作业sampleProject et3:b9912b9b05794aec8f4292b2ae493612_eeb0082ade6f4a58a14753d1

    • 考虑以下设置: 发布/订阅 数据流:用于验证发布/订阅、解包和写入BigQuery的事件的流作业 BigQuery 我们在通过Datafow管道的有效事件上有计数器,并观察到计数器高于发布/订阅中可用的事件量。 注意:我们似乎在BigQuery中也看到了重复项,但我们仍在调查中。 在数据流日志中可以观察到以下错误: 请注意,数据流作业是在发布/订阅中已有数百万条消息等待时启动的。 问题: 这是否会

    • 我的管道是IoTCore->pub/sub->Dataflow->bigQuery。最初,我得到的数据是Json格式的,管道工作正常。现在我需要转向csv,问题是我使用的Google定义的数据流模板使用Json输入而不是csv。是否有一种简单的方法通过数据流将csv数据从pub/sub转移到bigquery。模板可能会改变,但它是用Java实现的,我从来没有用过,所以需要很长时间来实现。我还考虑过

    • 如何使用带有DataflowRunner的apache光束从Google BigQuery数据集获取表列表? 我找不到如何从指定的数据集中获取表。我想使用数据流的并行处理编程模型将表从位于美国的数据集迁移到位于欧盟的数据集。

    • 使用“file_loads”技术通过Apache Beam数据流作业写入BigQuery时出错。流式插入(else块)工作正常,符合预期。file_load(如果块)失败,错误在代码后面给出。bucket中GCS上的临时文件是有效的JSON对象。 来自pub/sub的原始事件示例: 数据流作业出错:

    • 我发现了几个相关的问题,但谷歌团队对这个问题没有明确的答案: 是一个Cloud DataFlow作业,写入BigQuery,限制为每秒100K行每表(即BigQuery)的配额。BQ流限制)? google数据流写入bigquery表性能 云数据流性能——我们的时代是否值得期待? 编辑:主要动机是找到一种方法来预测各种输入大小的运行时。 我成功地运行了显示