处理多个 Pubsub 主题的数据流管道设计

Dataflow Pipeline Design to handle Multiple Pubsub Topics

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

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

选项 - 1 + 在 read/write 期间减少 Pubsub 的负载,因为即使是合并的消息也可能适合几百 KB - 读取步骤和中间处理是在单独的管道中完成的(这对于数据流来说可能不是低效的)

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

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

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

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

之后,您可以应用 Values PTransform 生成 PCollection>,然后将其输入 Remove Duplicates P变换。这将为您提供我认为您正在寻找的 Set 语义,因为 Remove Duplicates 单独应用于每个 window。

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