您如何表示 Apache Beam 中长时间延伸的非规范化连接

Posted

技术标签:

【中文标题】您如何表示 Apache Beam 中长时间延伸的非规范化连接【英文标题】:How do you express denormalization joins in Apache Beam that stretch over long periods of time 【发布时间】:2018-04-27 23:45:12 【问题描述】:

对于上下文,我从未使用过 Beam。我正在尝试了解如何将 Beam 模型应用于常见用例。

假设您有一个无限的生产者集合和一个无限的产品集合,这样每个产品都有一个生产者(一对多,生产者到产品)。并且您拥有产品的生产者出现在其产品之前(或之后不久)的附加属性。但是生产者可能会出现在其产品之前数年。

如果您想与生产者一起制作无限的产品集合,那么表达这一点的合适方式是什么?有一个延长数年的窗口连接似乎破坏了窗口的意义。但是,将生产者作为辅助输入似乎无法处理生产者可能与产品出现时非常接近的问题。

有没有合适的方法来混合这两个概念?

【问题讨论】:

【参考方案1】:

由于 Producer 可能出现在其 Product 之前数年,您可以使用一些外部存储(例如 BigTable)来存储您的 Producer 并为 Product 流编写 ParDo 以进行查找和执行连接。为了进一步优化性能,您可以利用有状态的 DoFn 功能来批量查找(查看 this 博客)。

对于产品数据在生产者数据之前交付的情况,您仍然可以使用窗口化和 CoGroupByKey 进行联接。但是,这里的窗口可以小到足以处理乱序交付。

【讨论】:

假设你从一个无限制的来源(例如 pubsub)加载这些生产者并且你正在窗口化产品(例如每小时)你如何有效地重新查询该窗口所需的生产者?当主管道流式传输时,如何根据需要定期重新查询它们? 由于 Python SDK 尚不支持 BigTable,是否可以使用 BigQuery 进行有状态处理?

以上是关于您如何表示 Apache Beam 中长时间延伸的非规范化连接的主要内容,如果未能解决你的问题,请参考以下文章

Apache Beam 数据流 BigQuery

Apache Beam:DoFn 与 PTransform

如何运行 Apache Beam 集成测试?

Apache Beam 批处理早期输出?

如何使用 Apache BEAM 在 BigQuery 中执行快速联接

apache beam入门之 窗口水位线和超时数据概念