【问题标题】:Dataflow Pipeline Design to handle Multiple Pubsub Topics处理多个发布订阅主题的数据流管道设计
【发布时间】:2015-09-18 18:46:35
【问题描述】:

我有一个管道,它从 Pubsub 主题中读取(以分钟为窗口)并将处理后的结果写入 BigQuery。我希望将表按时间以及数据本身的一些键进行分片。 BigQueryIO 确实提供了按窗口时间戳进行分片的选项,但我认为它没有提供任何选项来通过输入集合本身的某个键对表进行分片。如果我错过了一些替代方案,请告诉我。

为了克服这个问题,(选项 1)我选择通过相同的键对源 Pubsub 主题本身进行分片,因此,设置管道以从多个源中读取并沿着单独的分支处理它们,并将每个分支结果写入 BigQuery 分区通过似乎有效的窗口时间戳。我想知道的是,由于在我的情况下,Dataflow 中的中间处理步骤可能与源或接收器无关,(选项 2)如果我继续使用它是否会使管道更高效(在资源和时间方面)单个 Pubsub 主题并在 BigQuery 写入步骤之前添加一个额外的转换以对集合进行分区,然后写入 BigQuery。

选项 - 1 + 在读/写期间对 Pubsub 造成的负载较小,因为即使组合的消息也可能适合几百 KB - 读取步骤和中间处理在单独的管道中完成(这对于 Dataflow 可能不会低效)

选项 - 2 + 管道更清洁 - 分区的附加步骤,它读取相同集合的次数与我们拥有的分区数量一样多 - 但集合项的数量和分区本身非常小 - 所以,这应该不是一个更大的问题

我想选项 2 在阅读 Pipeline Design Principles 时更有意义,但我仍然想澄清我所做的是正确的。

【问题讨论】:

  • 我还有一个后续问题。假设我有类似PCollection<KV<String, Set<FrequentItem<String>>>> output 的东西,其中键是唯一的,我想将每个值写入一个基于键命名的不同 BQ 表(集合中的每个元素都是单独的行)。我可以写一个 ParDo,但是我需要配置我自己的 BQWriter,因为 BQWrite.IO 只能在 PCollection 上工作,对吧?那么,在这种情况下,我该如何构建管道呢?如果有一种方法可以有效地遍历 PCollection,那么我可以为每个值触发单独的 ParDos。
  • 您是否预先知道要写入的固定数量的键?
  • 另外,Set> 的目的是对FrequentItem 值执行重复数据删除吗?
  • key 的数量不是固定的,但应该在 10-15 之间,并且在可预见的将来不会超过 50。因此,如果您正在研究它,那么迭代它可能不是一个大问题。至于 Set 部分,我使用的其中一个库返回一个我刚刚携带的 Set。如果只是一个可迭代的帮助,它也不应该是一个问题/
  • 传递 KV> 而不是 KV>> 有一个好处,因为这使 Dataflow 有机会在每个(String,FrequentItem) 与 Set 中的其他项并行,而不是仅以 Set 粒度并行化。

标签: google-cloud-platform google-cloud-dataflow


【解决方案1】:

选项 2 似乎是一个合适的选择,前提是您有固定数量的要输出到的键。

从 PubSub 读取数据,您可以将可能需要的任何转换应用到 Partition PTransform,该 PTransform 将 PCollection 拆分为固定数量的输出 PCollection。在上图中,我分别标记了这些 A、B 和 C。

之后,您可以应用 Values PTransform 来生成 PCollection>,然后将其输入 Remove Duplicates PTransform。这将为您提供我相信您正在寻找的 Set 语义,因为 Remove Duplicates 分别适用于每个窗口。

最后,您将应用任何其他 PTransforms 将您的 PCollection> 转换为 PCollection 并将其连接到 BigQuery 接收器。

【讨论】:

  • 感谢您的更新。在PCollection<KV<String, Set<FrequentItem<String>>>> output 中,如果我们知道密钥将是唯一的并且尺寸非常小,那么是否有顺序拆分 PCollection 而不是将其传递给 ParDo?我猜它不太适合 Dataflow 生态系统,但只是想检查它是否可行?就像上面的例子一样,如果我运行转换 A、B 和 C,我将在每种情况下只得到一个 Set>。那么,除了 ParDo,我可以做一些更有顺序的事情来加速管道吗?
  • Dataflow 将它可以运行的所有步骤融合在一起,并且在底层,分区将与其周围的步骤融合在一起,从而无需尝试顺序拆分 PCollection。更多详情请点击此处:cloud.google.com/dataflow/service/…
  • Partition返回一个PcollectionList,那么如何识别列表中每个pcollection所属的各个表??
  • 您放入分区i的元素将在PCollectionList中的PCollectioni中可用。请参阅Partition.java 的评论中的此示例,其中学生在 PCollection 0 中处于百分位 [0, 10),在 PCollection 1 中处于百分位 [10, 20) 的学生等等。
猜你喜欢
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
  • 2017-05-07
  • 1970-01-01
相关资源
最近更新 更多