Apache Beam Python SDK 会丢弃延迟数据,还是无法配置延迟参数?

Posted

技术标签:

【中文标题】Apache Beam Python SDK 会丢弃延迟数据,还是无法配置延迟参数?【英文标题】:Does the Apache Beam Python SDK discard late data, or is it just impossible to configure lateness params? 【发布时间】:2019-12-14 19:36:19 【问题描述】:

我的用例是我尝试使用 Apache Beam Python SDK 聚合来自 Google PubSub 订阅的数据,时间为 1 小时。我已经像这样配置了我的管道窗口:

beam.WindowInto(
    window.FixedWindows(60 * 60, 0),
    trigger=AfterWatermark(
        early=AfterCount(1),
        late=AfterCount(1)),
    accumulation_mode=AccumulationMode.ACCUMULATING)

我的问题是每个窗口我应该看到大约 60 条消息,而我最多只能看到 45-46 条,通常低于这个数字。

现在,一些研究让我相信 Beam 可能会丢弃它认为迟到的任何数据,即使我已经以这种方式设置了触发器。 Beam Streaming 文档提到 Beam SDK for Python 目前不支持允许的延迟。 我不清楚它是否不支持设置特定的延迟配置,或者它是否完全丢弃延迟数据.

L.E:我的完整数据集似乎确实存在,但是关于使用 Python SDK 在 Beam 中处理后期数据的一些说明将有助于设定预期。

【问题讨论】:

“如果我以这种方式设置触发器”是什么意思? 我的意思是我将窗口触发器设置为在每个早期和晚期事件之后触发。虽然我仍然不能 100% 确定 Beam for Python 如何处理数据延迟,但我的问题有所不同(在下面的答案中指定)。 【参考方案1】:

所以我的问题实际上是PubSub 有时会严重乱序传递消息。虽然总体方向是从旧到新,但如果有 2-3 天的数据积压,您可以看到 10-48 小时的价差。如果收集了完整的缓冲区,则实际上不会丢弃任何数据。

不使用DirectRunner 而是使用DataflowRunner 时问题得到缓解,因为在Dataflow 服务器上运行管道时吞吐量要高得多。

关于丢弃延迟数据的问题仍未记录(文档仅提到,截至 2019 年 9 月,Python 目前不支持配置数据延迟策略)。使用上述设置似乎可以正确触发延迟数据。

【讨论】:

以上是关于Apache Beam Python SDK 会丢弃延迟数据,还是无法配置延迟参数?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何使用 python sdk 在 Apache Beam 中读取带有附件的 CSV 文件?

Apache Beam - org.apache.beam.sdk.util.UserCodeException:java.sql.SQLException:无法创建 PoolableConnecti

Beam编程系列之Java SDK Quickstart(官网的推荐步骤)

带有 DirectRunner 的 Apache Beam (SUBPROCESS_SDK) 仅使用一个工作人员,我如何强制它使用所有可用的工作人员?

Apache Beam - 跳过管道步骤

Apache Beam/数据流重组