Flink:我们可以只更新 processBroadcastElement 函数中某些元素的键控状态吗?

Flink: Can we update a keyed state for only some elements in processBroadcastElement function?

如回答 中所述,我可以使用 applyToKeyedState 以相同的方式更新所有键的所有状态。

如果我的广播事件包含所有键的子集,而我只想更新这些键,我可以将其作为 KeyedStateFunction 的一部分吗?

例子

ctx.applyToKeyedState(stateDescriptor, new KeyedStateFunction[K, ValueState[Boolean]]() {
      override def process(k: K, state: ValueState[Boolean]): Unit = {
        val key = k.asInstanceOf[String]

        if (broadcastEvent.contains(key)) {
          state.update(true))
        }
      }
    })

没有什么能阻止您在 KeyedStateFunction 中使用您想要的任何逻辑,但您可能会给自己带来麻烦。问题是:您的键控广播函数运算符的每个实例都将独立应用此函数。作业可能随时崩溃——也许在某些实例应用了 KeyedStateFunction 而其他实例没有应用之后。

即使在 failure/recovery 或重新缩放之后,您也应该将自己限制在永远不会引起不一致的键控状态上。