我不是在问广播模式是什么,而是具体在广播状态。在this example和this one中,无论何时处理广播元素,都将它们添加/放入BroadcastState:
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,这一点很重要,以便在发生重新缩放时,可以实现确定的行为。但是在这种情况下,每个并行实例将始终需要所有模式,因此在重新缩放时发生的一切无关紧要。
我误会了吗?
使用本地状态而不是由Flink管理的状态的问题是,它不会容错。当然,如果广播状态为静态,则在重新启动过程中自行重新加载它可能并不困难。但是在一般情况下,将广播状态与其余状态由Flink管理一起存储在一个一致的状态存储中是很方便的。特别是如果广播状态正在不断更新。