首页 > 解决方案 > Flink:我们可以只更新 processBroadcastElement 函数中某些元素的键控状态吗?

问题描述

正如这里的答案中提到的,我可以用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))
        }
      }
    })

标签: apache-flink

解决方案


没有什么能阻止你在你的KeyedStateFunction. 问题是这样的:你的键控广播函数操作符的每个实例都将独立地应用这个函数。并且该作业可能在任何时候崩溃 - 可能在某些实例应用了之后KeyedStateFunction,而其他实例则没有。

您应该将自己限制在不会引起不一致的键控状态上的操作,即使在失败/恢复或重新缩放之后也是如此。


推荐阅读