Welcome to MLink Developer Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.1k views
in Technique[技术] by (71.8m points)

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

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

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to MLink Developer Q&A Community for programmer and developer-Open, Learning and Share
...