flink如何让非广播流后于广播流初始化后执行?
问题:有什么办法可以让非广播流processElement在广播流processBroadcastElement读取完毕之后进行?
伪代码如下:
DataStream a //来自外部source
DataStream b //来自一个计算结果
a.connect(b.broadcast())
.process(
processElement(){
读取广播流 //报空指针异常
}
processBroadcastElement(){
初始化广播流
}
)
说明:报空指针异常原因:因为b的计算结果还未产生,所以广播流初始化未完成,读取就报错了!
这有个简单的流程图:
大佬们如何解决呀!!TnT。。。。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我试了两种方案:(1)是创建一个c流进行env.fromCollection自定义初始化,然后使用c.union(b),将两条流进行合并,这样做就可以解决报错问题,但是自定义初始化并不是我想要的结果,所以在下游会先用到这个自定义初始化,导致影响结果。(2)在a流上方定义一个线程休眠函数sleep进行延迟发送,这样结果不会影响,但延迟时间长短不好掌握。
!!终于在flink官方中文邮箱列表中找到了一个合理的解决方案,在处理数据流的方法中使用ListState对数据进行“缓冲”,等到广播状态更新好后将“缓冲”的数据进行处理。