通过 Google Cloud Pub/Sub 将数据重播到 Apache Beam 管道中,而不会使其他订阅者超载
Posted
技术标签:
【中文标题】通过 Google Cloud Pub/Sub 将数据重播到 Apache Beam 管道中,而不会使其他订阅者超载【英文标题】:Replaying data into Apache Beam pipeline over Google Cloud Pub/Sub without overloading other subscribers 【发布时间】:2019-07-30 16:14:58 【问题描述】:我在做什么:我正在构建一个系统,其中一个 Cloud Pub/Sub 主题将由数十个 Apache Beam 管道以流模式读取。每次我部署新管道时,它都应该首先处理几年的历史数据(存储在 BigQuery 中)。
问题:如果我在部署新管道时将历史数据重播到主题中(如建议的here),它也将传送到当前正在读取该主题的所有其他管道,这将是浪费且非常昂贵的。我不能使用 Cloud Pub/Sub Seek(建议 here),因为它最多存储 7 天的历史记录(更多详细信息 here)。
问题:以最小的开销(并且不会导致事件时间/水印问题)将历史数据重播到新的 Apache Beam 流管道中的推荐模式是什么?
当前想法:我目前可以想到三种解决问题的方法,但是,它们似乎都不是很优雅,而且我还没有看到文档中提到的任何一种,常见模式(@ 987654324@ 或 part 2) 或其他地方。它们是:
理想情况下,我可以使用Flatten 将实时ReadFromPubSub
与一次性BigQuerySource
合并,但是,我发现了三个潜在问题:a) 我无法解释以下数据已发布到 Pub/Sub,但尚未发布到 BigQuery,b) 我不确定如果重新启动管道,BigQuerySource
是否可能会无意中重新运行,以及 c) 我不确定 BigQuerySource
是否在流模式下工作(根据表格here)。
我为每个管道创建一个单独的重播主题,然后使用Flatten 合并主主题的ReadFromPubSub
s 和特定于管道的重播主题。部署管道后,我将历史数据重播到特定于管道的重播主题。
我为每个管道创建专用主题并部署一个单独的管道,该管道读取主要主题并将消息广播到特定于管道的主题。每当需要重播时,我都可以将数据重播到特定于管道的主题中。
【问题讨论】:
【参考方案1】:根据您的三个想法:
第一个不起作用,因为目前 Python SDK 不支持从有限源进行无限读取(这意味着您无法将 ReadFromBigQuery
添加到流式管道)。
第三个听起来过于复杂,而且可能成本很高。
我相信您目前最好的选择是如您所说,将您的表格重播到一个额外的 PubSub 主题中,正如您正确指出的那样。
我会检查是否有更好的解决方案,但目前,选项 #2 应该可以解决问题。
另外,我建议您联系interesting talk from Lyft on doing this for their architecture(在 Flink 中)。
【讨论】:
感谢您的意见 - 非常有趣的谈话,似乎他决定采用与 #2 非常相似的方法。如果我尝试创建一个以流模式读取 BigQuery 的自定义源,您知道我是否会遇到困难?以上是关于通过 Google Cloud Pub/Sub 将数据重播到 Apache Beam 管道中,而不会使其他订阅者超载的主要内容,如果未能解决你的问题,请参考以下文章
如何修改后台 Cloud Function 的 Google Cloud Pub/Sub 订阅确认截止日期
如何通过 Google Cloud Monitoring JAVA 客户端库获取 Pub/Sub 订阅中未确认消息的数量