乐趣区

flink-DataStream算子中如何实时更新变量

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

成功解决!还有在迭代流中还可以使用 windows 操作。
4. 方案(3)使用 Flink 的 DataStreamUtils。实验未成功,成功的大佬分享一下!
欢迎查看相关入门博客:https://segmentfault.com/a/11…

退出移动版