我不是在问广播模式是什么,而是具体在广播状态。在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,这一点很重要,以便在发生重新缩放时,可以实现确定的行为。但是在这种情况下,每个并行实例将始终需要所有模式,因此在重新缩放时发生的一切无关紧要。
我误会了吗?
答案 0 :(得分:0)
使用本地状态而不是Flink管理的状态的问题是它不会容错。当然,如果广播状态是静态的,则在重新启动期间自己重新加载它可能并不困难。但是在一般情况下,将广播状态与其余状态由Flink管理一起存储在一个一致的状态存储中是很方便的。尤其是在广播状态不断更新的情况下。