Flink中使用Broadcast Stream时,同一个算子的不同子任务的广播状态是隔离的还是共享的?
When using Broadcast Stream in Flink,the broadcast state of different subtasks of the same operator is isolated or shared?
在我的 flink 工作中,我使用 Broadcast State 是这样的:
env.setParallelism(4);
BroadcastStream<String> configBroadcastStream = env.addSource(new BroadCastDataSource(), "BroadCastDataSource").broadcast(configStateDescriptor);
DataStream<String> mapStream = withWatermarkStream.map(e -> e.f4);
DataStream<String> connectedStream = mapStream.connect(configBroadcastStream).process(new BroadcastFunction(configStateDescriptor));
我想知道同一个算子的不同子任务访问的广播状态(代码如下)是否是隔离的?
BroadcastState<String,String> state = context.getBroadcastState(mapStateDescriptor);
每个子任务维护自己独立的广播状态副本。工作状态总是在堆上(就像所有非键控状态一样),并且每个子任务独立地在检查点和保存点中包含其广播状态的副本。将 RocksDB 用于广播状态不是一种选择。
请注意,如果广播流来自并行源,则不同的子任务可以以不同的顺序接收广播元素。您需要将广播源限制为单个实例,或者注意广播状态更新不依赖于它们到达的顺序,否则您可能会以不一致告终。
有关详细信息,请参阅 the docs。
在我的 flink 工作中,我使用 Broadcast State 是这样的:
env.setParallelism(4);
BroadcastStream<String> configBroadcastStream = env.addSource(new BroadCastDataSource(), "BroadCastDataSource").broadcast(configStateDescriptor);
DataStream<String> mapStream = withWatermarkStream.map(e -> e.f4);
DataStream<String> connectedStream = mapStream.connect(configBroadcastStream).process(new BroadcastFunction(configStateDescriptor));
我想知道同一个算子的不同子任务访问的广播状态(代码如下)是否是隔离的?
BroadcastState<String,String> state = context.getBroadcastState(mapStateDescriptor);
每个子任务维护自己独立的广播状态副本。工作状态总是在堆上(就像所有非键控状态一样),并且每个子任务独立地在检查点和保存点中包含其广播状态的副本。将 RocksDB 用于广播状态不是一种选择。
请注意,如果广播流来自并行源,则不同的子任务可以以不同的顺序接收广播元素。您需要将广播源限制为单个实例,或者注意广播状态更新不依赖于它们到达的顺序,否则您可能会以不一致告终。
有关详细信息,请参阅 the docs。