flink 广播流和广播状态

flink broadcast stream and broadcast state

关于广播流和广播状态,我得到了以下两个问题,请问有人能帮忙解答一下吗?谢谢!

  1. KeyedBroadcastProcessFunction#Context有下面的方法(getBroadcastState),请问广播状态为什么要用map状态描述符?我认为广播状态应该使用 BroadcastStateDescriptor 之类的东西,地图状态描述符用于 MapState?

public abstract <K, V> BroadcastState<K, V> getBroadcastState(final MapStateDescriptor<K, V> stateDescriptor);

  1. DataStream#broadcast方法定义如下:
  def broadcast(broadcastStateDescriptors: MapStateDescriptor[_, _]*): BroadcastStream[T] = {
    if (broadcastStateDescriptors == null) {
      throw new NullPointerException("State Descriptors must not be null.")
    }
    javaStream.broadcast(broadcastStateDescriptors: _*)
  }

请问参数broadcastStateDescriptors有什么用?为什么我必须在直播时这么早提供它?我想我可以在 KeyedBroadcastProcessFunction#processBroadcastElement 中创建描述符并在需要时获取广播状态,其中操作员接收广播元素并更新广播状态。

  1. MapState是Flink支持广播的那种状态(也是唯一一种状态)。由于广播状态始终是 MapStateMapStateDescriptor 是用来处理它的。

  2. Flink 需要知道如何序列化正在广播的数据; broadcastStateDescriptorsDataStream#broadcast 用于此目的。