Apache Beam 管道中的连续状态

Continuous state in Apache Beam pipeline

我正在为数据流运行器开发光束管道。我的用例需要以下功能。

  1. 从 Kafka 主题读取输入事件。每个 Kafka 消息值派生 [userID, Event] 对。
  2. 对于每个 userID,我需要维护一个 profile,并且基于当前的 Event,可以更新 profile。如果 profile 已更新:
    • 已更新 profile 写入输出流。
    • 管道中 userID 的下一个 Event 应参考更新后的配置文件。

我正在考虑使用 Beam 中提供的状态功能,而不依赖外部键值存储来维护用户配置文件。这对于当前版本的 beam (2.1.0) 和 dataflow runner 是否可行?如果我理解正确,状态的范围仅限于单个 window 触发中的元素(即,即使对于 GlobalWindow,状态也将范围限定为 window 的单次触发中的元素由触发器引起)。我在这里遗漏了什么吗?

State 非常适合您的用例。

唯一的更正是状态范围限定为单个 window,但触发器触发不会影响它。因此,如果您的状态很小,您可以将其存储在全局 window 中。当一个新元素到来时,你可以使用状态,根据需要输出元素,并对状态进行更改。

唯一要考虑的是,如果您拥有无限数量的用户 ID,状态可能会变得多大。例如,您可能需要一个不活动计时器在一段时间后清除旧的用户状态。

如果您还没有阅读它们,博客文章 Stateful Processing with Apache Beam and Timely (and Stateful) Processing with Apache Beam 很好地介绍了这些概念和 API。