【问题标题】:How to clear the whole MapSate state with only one call如何只用一个电话清除整个 MapSate 状态
【发布时间】:2020-09-08 15:42:54
【问题描述】:

我知道如果我这样做 mapState.clear() 我将能够将所有值清除到特定键的状态中,但我的问题是:有没有办法做类似 mapState.clear() 的事情并清除所有状态只需一个电话即可进入 mapStates?将类似于 mapState.isEmpty() 它会显示“true”,因为 mapState 中的所有键都已清理,而不仅仅是当前键。

谢谢。 亲切的问候!

【问题讨论】:

    标签: apache-flink flink-streaming flink-cep flink-statefun


    【解决方案1】:

    因为我们讨论的是嵌套地图的情况,所以很容易混淆我们的术语。所以让我们把这个问题放到一个例子的上下文中。

    假设您有一个关于用户的事件流,并且在 KeyedProcessFunction 中使用 MapState<ATTR, VALUE> 来维护每个用户的属性/值对的映射:

    userEvents
        .keyBy(e -> e.userId)
        .process(new ManageUserData())
    

    在 process 函数中,任何时候使用 MapState 都只能为正在处理的事件对应的用户操作一张地图,

    public static class ManageUserData extends KeyedProcessFunction<...> {
        MapState<ATTR, VALUE> userMap;
    }
    

    所以userMap.clear() 将清除一个用户的整个属性/值对映射,但不理会其他映射。

    我相信您在问是否有某种方法可以一次清除所有用户的所有 MapState。是的,有一种方法可以做到这一点,虽然它有点晦涩难懂,而且实现起来并不完全简单。

    如果您将本例中的KeyedProcessFunction 更改为KeyedBroadcastProcessFunction,并将广播流连接到用户事件流,则在该KeyedBroadcastProcessFunction 中,您可以在processBroadcastElement() 方法中使用KeyedBroadcastProcessFunction.Context.html#applyToKeyedState遍历所有用户,并为每个用户清除他们的 MapState。

    您必须随时安排在广播流上发送事件。

    您应该注意warnings in the documentation 关于处理广播状态的信息。请记住,processBroadcastElement() 中实现的逻辑必须在所有并行实例中具有相同的确定性行为。

    【讨论】:

      猜你喜欢
      • 2017-08-28
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      • 2021-08-27
      • 2011-03-02
      相关资源
      最近更新 更多