【问题标题】:Streaming Dataflow pipeline with no sink没有接收器的流式数据流管道
【发布时间】:2017-01-24 19:51:39
【问题描述】:

我们有一个在 Google Cloud Dataflow 上运行的流式 Dataflow 管道 worker,需要从 PubSub 订阅中读取,组 消息,并将它们写入 BigQuery。内置的 BigQuery Sink 可以 不适合我们的需求,因为我们需要针对特定​​的数据集和表 对于每个组。由于流式传输不支持自定义接收器 管道,似乎唯一的解决方案是执行插入 ParDo 中的操作。像这样的:

在管道中没有接收器是否存在任何已知问题,或者在编写此类管道时需要注意什么?

【问题讨论】:

  • 我们有一个管道,需要根据输入写入不同的数据集/表。我们使用 side outputs 写入 N 个 BigQuery 接收器。这对你也有用吗?
  • 我想过,但你的 N 有多大?对我们来说,N 大约是 100 万。
  • 呃……我们有大约 10-20 个水槽。我认为100万可能是个问题!这听起来像是一个奇怪的请求 - 您需要在 BigQuery 中写入一百万个不同的表。您能否详细说明您要解决的问题并提供更多背景信息?

标签: google-cloud-dataflow


【解决方案1】:

在没有接收器的情况下编写管道应该没有任何问题。实际上,sink 是流中ParDo 的一种类型。

我建议您使用自定义 ParDo 并将 BigQuery API 与您的自定义逻辑结合使用。这里是BigQuerySink的定义,你可以以此代码为起点。

您可以定义自己的 DoFn,类似于 StreamingWriteFn,以添加您的自定义 ParDo 逻辑,该逻辑将写入相应的 BigQuery 数据集/表。

请注意,这里使用的是Reshuffle,而不是GroupByKey。我建议您使用 Reshuffle,它也会按键分组,但要避免不必要的窗口延迟。在这种情况下,这意味着元素一进来就应该被写出,没有额外的缓冲/延迟。此外,这允许您在运行时确定 BQ 表名称。

编辑:我不建议使用内置的 BigQuerySink 写入不同的表。此建议是在您的自定义 DoFn 中使用 BigQuery API,而不是使用 BigQuerySink

【讨论】:

  • 是否可以在此处发布几行代码来展示如何根据 ParDo 中 ProcessContext 的内容执行自定义 ParDo 以针对 BIgQuery 中的特定数据集/表?我们在这里有一个类似的问题 [link](stackoverflow.com/questions/41698754/…),因为我们无法弄清楚如何在使用内置 BQ DataFlow 接收器时根据传入的 PCollection 元素以编程方式传递目标 BQ 表名称。
  • 我不建议使用内置的 BigQuerySink 写入不同的表。此建议是在您的自定义 DoFn 中使用 BigQuery API,而不是使用 BigQuerySink @Thomas,我很乐意帮助您解决在编写此代码时可能遇到的任何问题。一旦你得到这个工作,愿意分享一些示例代码吗?如果您决定使用我建议的方法。再次,如果您遇到任何问题,请告诉我。我很乐意提供帮助。
  • @AlexAmato - 为什么不呢?如果接收器的数量合理,那么我认为在管道中使用多个 BigQuery 接收器(即使用侧输出)没有问题。我们在许多管道上都这样做,而且效果非常好。
  • @GrahamPolley 是的,如果接收器的数量合理,那么应该没问题。如果太多,则存在一些内存问题。所以一般不推荐。这是更多信息。 github.com/GoogleCloudPlatform/DataflowJavaSDK/issues/62
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 2021-08-25
  • 2022-08-17
  • 1970-01-01
  • 2021-04-10
相关资源
最近更新 更多