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

发布于 2022-09-12 03:16:56 字数 440 浏览 24 评论 0

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

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

千纸鹤 2022-09-19 03:16:56

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文