1.问题描述,如下图:图片.png
在写机器学习算法时遇到这样一个场景,在第一个map需要用到变量currentCenter,然后我输出的结果需要更新currentCenter(最后一个map),但是没办法更新。因为map函数是并行的,传入的currentCenter实际上是一个复制品,在map中修改currentCenter复制品是不会改变原变量的。
2.方案(1)数据库/文件系统
使用外部数据库/文件系统,在第一个map函数不断的读取外部数据库/文件系统数据,第二个map函数中不断更新外部数据库/文件数据,可以达到实时动态更新变量的效果。但这样的缺点就是频繁的io开销,相当于将flink退化成了mapreduce的计算模型。pass
3.方案(2)迭代流+广播流
这里有个很明显的特征,就是我需要在下游的流中更新到上游的流数据,这不就是迭代流吗?
不熟悉迭代流的可以查一下官网或看一下我的示例:
https://segmentfault.com/a/11...
方向已经明确了,我需要对我的实时变量进行迭代流操作。还有一个问题就是我的实时变量是通过输入流的数据和实时变量计算得到的,所以这里就需要把我的迭代流广播到输入流计算,然后生成新的实时变量流继续迭代,大致的流程图如下:
图片.png
成功解决!还有在迭代流中还可以使用windows操作。
4.方案(3)使用Flink的DataStreamUtils。实验未成功,成功的大佬分享一下!
欢迎查看相关入门博客:https://segmentfault.com/a/11...


ch123
60 声望7 粉丝

积土而为山,积水而为海。