Flink中的广播状态有什么用?

时间:2020-04-25 11:27:29

标签: java apache-kafka stream apache-flink

我不是在问广播模式是什么,而是具体在广播状态。在this examplethis one中,无论何时处理广播元素,都将它们添加/放置到Bro​​adcastState:

    public void processBroadcastElement(
     Pattern pattern, 
     Context ctx, 
     Collector<Tuple2<Long, Pattern>> out) throws Exception 
{
   // store the new pattern by updating the broadcast state
   BroadcastState<Void, Pattern> bcState = ctx.getBroadcastState(patternDesc);
   // storing in MapState with null as VOID default value
   bcState.put(null, pattern);
 }

假设不这样做,我们将Pattern添加到本地List或HashMap中。那会是什么问题呢?该文档说,每个并行实例以与其他实例相同的方式保留其自己的BroadcastState,这一点很重要,以便在发生重新缩放时,可以实现确定的行为。但是在这种情况下,每个并行实例将始终需要所有模式,因此在重新缩放时发生的一切无关紧要。

我误会了吗?

1 个答案:

答案 0 :(得分:0)

使用本地状态而不是Flink管理的状态的问题是它不会容错。当然,如果广播状态是静态的,则在重新启动期间自己重新加载它可能并不困难。但是在一般情况下,将广播状态与其余状态由Flink管理一起存储在一个一致的状态存储中是很方便的。尤其是在广播状态不断更新的情况下。