【发布时间】: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