欢迎访问我的GitHub
https://github.com/zq2599/blog_demos
内容:所有原创文章分类和汇总,及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;
系列链接
- 深入了解ProcessFunction的状态操作(Flink-1.10)
- Flink处理函数实战之一:ProcessFunction类
- Flink处理函数实战之二:KeyedProcessFunction类
- Flink处理函数实战之三:窗口处理
本篇概览
- 本文是《Flink处理函数实战》系列的第四篇,学习内容是如何同时处理两个数据源的数据;
- 试想在面对两个输入流时,如果这两个流的数据之间有业务关系,该如何编码实现呢,例如下图中的操作,同时监听9998和9999端口,将收到的输出分别处理后,再由同一个sink处理(打印):
![a957bc5fbca7a2bf0992c434cc9d64ae.png](https://i-blog.csdnimg.cn/blog_migrate/de4e377dd1eae597da8cc39514a94200.jpeg)
- Flink支持的方式是扩展CoProcessFunction来处理,为了更清楚认识,我们把KeyedProcessFunction和CoProcessFunction的类图摆在一起看,如下所示:
![0d8e44935aafe687bedffa5bb380d2da.png](https://i-blog.csdnimg.cn/blog_migrate/bb524545f818f98413f0caf3f5a378e2.jpeg)
- 从上图可见,CoProcessFunction和KeyedProcessFunction的继承关系一样,另外CoProcessFunction自身也很简单,在processElement1和processElement2中分别处理两个上游流入的数据即可,并且也支持定时器设置;
编码实战
接下来咱们开发一个应用来体验CoProcessFunction,功能非常简单,描述如下:
- 建两个数据源,数据分别来自本地9998和9999端口;
- 每个端口收到类似aaa,123这样的数据,转成Tuple2实例,f0是aaa,f1是123;
- 在CoProcessFunction的实现类中,对每个数据源的数据打日志,然后全部传到下游算子;
- 下游操作是打印,因此9998和9999端口收到的所有数据都会在控制台打印出来