问题:有什么办法可以让非广播流processElement在广播流processBroadcastElement读取完毕之后进行?
伪代码如下:
DataStream a //来自外部source
DataStream b //来自一个计算结果
a.connect(b.broadcast())
.process(
processElement(){
读取广播流 //报空指针异常
}
processBroadcastElement(){
初始化广播流
}
)
说明:报空指针异常原因:因为b的计算结果还未产生,所以广播流初始化未完成,读取就报错了!
这有个简单的流程图:
大佬们如何解决呀!!TnT。。。。
我试了两种方案:(1)是创建一个c流进行env.fromCollection自定义初始化,然后使用c.union(b),将两条流进行合并,这样做就可以解决报错问题,但是自定义初始化并不是我想要的结果,所以在下游会先用到这个自定义初始化,导致影响结果。(2)在a流上方定义一个线程休眠函数sleep进行延迟发送,这样结果不会影响,但延迟时间长短不好掌握。
!!终于在flink官方中文邮箱列表中找到了一个合理的解决方案,在处理数据流的方法中使用ListState对数据进行“缓冲”,等到广播状态更新好后将“缓冲”的数据进行处理。