flink如何让非广播流后于广播流初始化后执行?

问题:有什么办法可以让非广播流processElement在广播流processBroadcastElement读取完毕之后进行?
伪代码如下:

DataStream a //来自外部source
DataStream b //来自一个计算结果
a.connect(b.broadcast())
 .process(
    processElement(){
       读取广播流 //报空指针异常
    }
    processBroadcastElement(){
       初始化广播流
    }
)

说明:报空指针异常原因:因为b的计算结果还未产生,所以广播流初始化未完成,读取就报错了!
这有个简单的流程图:
图片.png
大佬们如何解决呀!!TnT。。。。

阅读 7.4k
2 个回答

我试了两种方案:(1)是创建一个c流进行env.fromCollection自定义初始化,然后使用c.union(b),将两条流进行合并,这样做就可以解决报错问题,但是自定义初始化并不是我想要的结果,所以在下游会先用到这个自定义初始化,导致影响结果。(2)在a流上方定义一个线程休眠函数sleep进行延迟发送,这样结果不会影响,但延迟时间长短不好掌握。

!!终于在flink官方中文邮箱列表中找到了一个合理的解决方案,在处理数据流的方法中使用ListState对数据进行“缓冲”,等到广播状态更新好后将“缓冲”的数据进行处理。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏