概述
我们有一个 Dataflow 流管道,它从 pubsub 订阅中读取消息,将 dict 转换为数据类并将数据写入 postgres。我注意到,有时,pubsub 吞吐量会变为零。在此期间,最大内存利用率通常为 95+%,但大多数时候,尽管内存为 95+%,数据仍然稳定地流过。
调试步骤
为了调试这个问题,我慢慢地(从下到上)删除了 PTransforms,部署它并观察。即使整个管道只是一个
ReadFromPubsub
变换而没有其他,这个问题在所有设置中都持续存在。这让我怀疑这可能是库实现中的内存泄漏。
观察/评论
内存的下降沿通常对应于缩放事件。在从 1->2 个工作人员的扩展事件期间,我们还注意到,如果我们最初只有工作人员 A,有时最终会有工作人员 B 和 C,而不是 A 和 B。这是否意味着 Dataflow 知道工作人员 A遇到内存问题并因此决定将其关闭吗?
这个问题也在另一个论坛中提出,这个response建议使用窗口作为解决方案。这是我试图以一种手波方式理解作者的意思 - 在仅使用全局窗口(我的情况)的流管道中,DoFns 没有机会进行垃圾收集,因为它们永久“打开”? (
teardown
永远不会被调用?)因此,我们需要给它一个间隙,我们可以通过创建窗口来强制执行此操作(尽管之后的逻辑会很麻烦 - 就像窗口进入 5 秒窗口,当有窗口时重复触发) 1 个元素,最后按键分组并再次展平结果。基本上是一个无操作,只是我们想强制窗口化)
设置
2.48.0
3.9.14
Dataflow
我们已经确定了泄漏,https://github.com/apache/beam/issues/28246有详细信息和解决方法。