【问题标题】:Can a stateful DoFn have state that expires with a TTL? Or is unbounded growth OK?有状态的 DoFn 是否可以具有以 TTL 过期的状态?还是无限增长好吗?
【发布时间】:2021-02-18 03:17:58
【问题描述】:

我在 Apache Beam(在 Dataflow 中运行)中遇到了一种情况,我基于 this article 创建了一个简单的有状态 DoFn。上游窗口是全局的,更改它会影响下游聚合。

目前,我没有做任何事情来缩小状态,它似乎只是无限增长。这是真的?无限的状态增长是个问题吗?

我想简单地将 TTL 附加到状态,但看不到此功能。

我正在考虑在数据上存储我自己的时间戳,并使用计时器定期清理表。这是可取的吗?

正在存储的数据是一些事件数据的缓存键。缓存键告诉我,我需要为此事件查找过去的事件数据以补充当前事件。有状态的 DoFn 可以很好地解决这个问题,但是,就像我说的那样,我担心它会无限增长。我不确定在 Dataflow 中是否有任何后果。

【问题讨论】:

    标签: google-cloud-dataflow apache-beam


    【解决方案1】:

    当窗口过期时,状态会自动被垃圾收集。由于您使用的是全局窗口,因此它永远不会过期。因此,您需要自己使用计时器来管理它。

    我不知道你的代码细节,但你的想法听起来很正确:

    • 在您的状态中存储一个时间戳,以便您知道它的年龄
    • 设置一个周期性重复的事件时间计时器:
      • 清理表中早于 TTL 的内容
      • @OnTimer 方法可以重置同一个计时器

    您也可以直接为元素的 TTL 设置一个计时器,但这会导致更多的计时器被触发。所以只有在音量低的情况下才会好。 (但如果数量很少,您可能不必担心无限增长)

    【讨论】:

    • 嗨!我们正在使用这个对象 (StateSpec>) 将处理后的 元素的键存储在管道中。如果我们使用事件时间处理,这个状态对象会不会只为窗口中过期的事件自动收集垃圾? (不清除后续窗口中的任何后续事件)。 (如果没有,是否有像我们正在使用的对象一样可以使用 TTL 清除(即仅清除 statr 中的旧事件而不清除所有事件)
    猜你喜欢
    • 2021-08-19
    • 2012-06-19
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多