Flink-BroadcastState

609 阅读2分钟

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

概念

在开发过程中,如果遇到需要下发/广播配置、规则等低吞吐事件流到下游所有 task 时,就可以使用 Broadcast State。

Broadcast State 是 Flink 1.5 引入的新特性。

下游的 task 接收这些配置、规则并保存为 BroadcastState, 将这些配置应用到另一个数据流的计算中 。

场景

  1. 动态更新计算规则: 如事件流需要根据最新的规则进行计算,则可将规则作为广播状态广播到下游Task中。

  2. 实时增加额外字段: 如事件流需要实时增加用户的基础信息,则可将用户的基础信息作为广播状态广播到下游Task中。

API详解

  1. 首先创建一个Keyed 或Non-Keyed 的DataStream,

  2. 然后再创建一个BroadcastedStream,

  3. 最后通过DataStream来连接(调用connect 方法)到Broadcasted Stream 上,

  4. 这样实现将BroadcastState广播到Data Stream 下游的每个Task中。

Keyed Stream

如果DataStream是Keyed Stream ,则连接到Broadcasted Stream 后, 添加处理ProcessFunction 时需要使用KeyedBroadcastProcessFunction 来实现。

代码如下所示:

public abstract class KeyedBroadcastProcessFunction<KS, IN1, IN2, OUT> extends BaseBroadcastProcessFunction {

    public abstract void processElement(final IN1 value, final ReadOnlyContext ctx, final Collector<OUT> out) throws Exception;

    public abstract void processBroadcastElement(final IN2 value, final Context ctx, final Collector<OUT> out) throws Exception;

}

上面泛型中的各个参数的含义,说明如下:

  • KS:表示Flink 程序从最上游的Source Operator 开始构建Stream,当调用keyBy 时所依赖的Key 的类型;

  • IN1:表示非Broadcast 的Data Stream 中的数据记录的类型;

  • IN2:表示Broadcast Stream 中的数据记录的类型;

  • OUT:表示经过KeyedBroadcastProcessFunction 的processElement()和processBroadcastElement()方法处理后输出结果数据记录的类型。

Non-Keyed Stream

如果Data Stream 是Non-Keyed Stream,则连接到Broadcasted Stream 后,添加处理ProcessFunction 时需要使用BroadcastProcessFunction 来实现。

代码如下所示:

public abstract class BroadcastProcessFunction<IN1, IN2, OUT> extends BaseBroadcastProcessFunction {

public abstract void processElement(final IN1 value, final ReadOnlyContext ctx, final Collector<OUT> out) throws Exception;

public abstract void processBroadcastElement(final IN2 value, final Context ctx, final Collector<OUT> out) throws Exception;

}

上面泛型中的各个参数的含义,与前面KeyedBroadcastProcessFunction 的泛型类型中的后3 个含义相同,只是没有调用keyBy 操作对原始Stream 进行分区操作,就不需要KS 泛型参数。

核心点

  1. Broadcast State 是Map 类型,即K-V 类型。

  2. Broadcast State 只有在广播的一侧, 即在BroadcastProcessFunction 或KeyedBroadcastProcessFunction 的processBroadcastElement 方法中可以修改。在非广播的一侧, 即在BroadcastProcessFunction 或KeyedBroadcastProcessFunction 的processElement 方法中只读。

  3. Broadcast State 中元素的顺序,在各Task 中可能不同。基于顺序的处理,需要注意。

  4. Broadcast State 在Checkpoint 时,每个Task 都会Checkpoint 广播状态。

  5. Broadcast State 在运行时保存在内存中,目前还不能保存在RocksDB State Backend 中。