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...算法