Apache Beam状态管理/处理-在窗口范围内跨ParDo共享状态



My Dataflow管道将事件数据整理为按会话类型和按用户PCollections输出。我已经将GroupByKey用于由会话id键控的事件。在下一层次结构中,会话被分组为由用户id和设备id键控,使用相同的模式。因此,一个会话可能会生成许多事件,但反过来,一个用户可能会生成多个会话。

我现在想总结一下层次结构的每个级别的数据。我使用了StateSpec声明在事件级别持久化状态。例如,事件计数属性可以在我的事件处理ParDo中递增。(用例:例如,在所有用户的每个会话中生成一个错误事件。(

但由于每个ParDo都是静态的——我无法在ParDo上下文之外访问ValueState,尽管我的理解是这种状态是在Window范围内维护的。(也许这是故意的。(有没有一种方法可以在另一个ParDo中使用Beam state持久性库来访问这个Window级别的状态,而不是在最初声明的地方?就像我可以在管道级别声明一样?

我知道这可能会引入一些性能开销,因为框架必须管理并发,但实际处理似乎可以忽略不计。(只是增加值。(所以我更喜欢把它写在窗口级别的状态字段中,而不是通过层次结构向上渗透值。

不支持跨ParDos的状态共享,甚至不应该鼓励它,因为它带来了ParDos之间的依赖关系,打破了简单的契约:ParDo可以独立处理PCollection,从而解锁大规模并行性。

最新更新