Apache Beam Python ReadFromPubsub IO 中的内存泄漏

问题描述 投票:0回答:1

概述

我们有一个 Dataflow 流管道,它从 pubsub 订阅中读取消息,将 dict 转换为数据类并将数据写入 postgres。我注意到,有时,pubsub 吞吐量会变为零。在此期间,最大内存利用率通常为 95+%,但大多数时候,尽管内存为 95+%,数据仍然稳定地流过。

调试步骤

为了调试这个问题,我慢慢地(从下到上)删除了 PTransforms,部署它并观察。即使整个管道只是一个

ReadFromPubsub
变换而没有其他,这个问题在所有设置中都持续存在。这让我怀疑这可能是库实现中的内存泄漏。

观察/评论

  • 内存的下降沿通常对应于缩放事件。在从 1->2 个工作人员的扩展事件期间,我们还注意到,如果我们最初只有工作人员 A,有时最终会有工作人员 B 和 C,而不是 A 和 B。这是否意味着 Dataflow 知道工作人员 A遇到内存问题并因此决定将其关闭吗?

    • 其他时候,下降沿对应于工作线程 A 的重启。这也会清除内存。
  • 这个问题也在另一个论坛中提出,这个response建议使用窗口作为解决方案。这是我试图以一种手波方式理解作者的意思 - 在仅使用全局窗口(我的情况)的流管道中,DoFns 没有机会进行垃圾收集,因为它们永久“打开”? (

    teardown
    永远不会被调用?)因此,我们需要给它一个间隙,我们可以通过创建窗口来强制执行此操作(尽管之后的逻辑会很麻烦 - 就像窗口进入 5 秒窗口,当有窗口时重复触发) 1 个元素,最后按键分组并再次展平结果。基本上是一个无操作,只是我们想强制窗口化)

设置

  • Apache 光束版本 -
    2.48.0
  • Python 版本 -
    3.9.14
  • 跑步者 -
    Dataflow
python google-cloud-dataflow apache-beam
1个回答
0
投票

我们已经确定了泄漏,https://github.com/apache/beam/issues/28246有详细信息和解决方法。

© www.soinside.com 2019 - 2024. All rights reserved.