Google cloud dataflow Apache梁管道中的连续状态

Google cloud dataflow Apache梁管道中的连续状态,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我正在为dataflow runner开发一个梁管道。在我的用例中,我需要以下功能 从卡夫卡主题中读取输入事件。每个卡夫卡消息值派生出[userID,Event]对 对于每个用户标识,我需要维护一个配置文件,并且根据当前的事件,可以对配置文件进行可能的更新。如果更新了配置文件: 更新的配置文件写入输出流 管道中该userID的下一个事件应参考更新的配置文件 我考虑在Beam中使用提供的状态功能,而不依赖外部键值存储来维护用户配置文件。对于当前版本的beam(2.1.0)和dataflowru

我正在为dataflow runner开发一个梁管道。在我的用例中,我需要以下功能

  • 从卡夫卡主题中读取输入事件。每个卡夫卡消息值派生出
    [userID,Event]
  • 对于每个
    用户标识
    ,我需要维护一个
    配置文件
    ,并且根据当前的
    事件
    ,可以对
    配置文件
    进行可能的更新。如果更新了
    配置文件
    • 更新的
      配置文件
      写入输出流
    • 管道中该
      userID
      的下一个
      事件
      应参考更新的配置文件

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

    状态非常适合您的用例

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

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


    如果您还没有阅读过这些内容,请在博客中发布并提供这些概念和API的详细介绍。

    谢谢您的回答。因为状态是每个窗口,而不是窗口触发,所以它肯定是有用的。因此,一个全局窗口(或一个持续时间较长的固定时间窗口)在userID上有一个触发器,后跟
    GroupByKey
    ,这将保证userID的记录将被传递给持有用户状态的同一个worker。在有状态DoFn中使用的(
    setRelative
    offset
    )非活动计时器已经处理每个键和窗口的计时器。我的理解正确吗?基本上——但更简单。有状态DoFn的使用已经针对每个键,因此不需要在状态之前使用GroupBykey,也不需要使用触发器。只需设置一个窗口,让状态保留多长时间,然后使用用户ID作为键执行有状态DoFn。酷!这非常有用,因为
    GroupByKey
    在数据流中非常昂贵。当我们需要在到期前从窗口中取出一些东西时,触发器仍然是有意义的。在每个窗口触发中,状态将被更新,下一次触发将引用更新的状态。触发器不会影响有状态的DoFn。您的有状态DoFn将在输入元素到达时(在processElement中)或它设置的计时器触发时(在processTimer中)输出。只有在DoFn之后有其他聚合时才需要触发。