首页 > 解决方案 > Flink 中广播状态有什么用?

问题描述

我不是在问广播模式的用途,而是具体的广播状态。在这个例子这个例子中,每当广播的元素被处理时,它们被添加/放入广播状态:

    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 非常重要,以便在发生重新缩放时实现确定性行为。但在这种情况下,每个并行实例将始终需要所有模式,因此重新缩放时发生的任何事情都无关紧要。

我是不是误会了什么?

标签: javaapache-kafkastreamapache-flink

解决方案


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


推荐阅读