概述
這張圖表明了flink是如何看待用戶的處理流程的:抽象化為一系列operator,以source開始,以sink結尾,中間的operator做的操作叫做transform,並且可以把幾個操作串在一起執行。
什么是operator?
在源碼中,我們可以看到一個flatMap算子,最終會被轉化成一個operator,下圖是flatMap被轉化成一個 operator。
下圖是map轉化成一個 operator。
我們可以認為用戶使用的各種算子,最終都是轉化成一個 operator。
多個operator如何排序組合
Flink采用了類似責任鏈模式的方式對operator進行組合,責任鏈模式下,通常每個接收者都包含對另一個接收者的引用。如果一個對象不能處理該請求,那么它會把相同的請求傳給下一個接收者,依此類推。具體參見:https://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html
程序什么時候運行
在編寫代碼的時候,不管是flatMap還是map等算子的使用,都是將operator注冊到環境中,並沒有開始執行任務。當用戶調用execute方式的時候,程序才開始准備執行。
env.execute("word count")
這里面主要做了兩件事情,一件事情是根據上面配置的責任鏈模式將生成StreamGraph,即程序的拓撲結構圖。另外一件事情就是生成JobGraph,也就是task list。
接下來的事情就比較好理解了,回到了客戶端提交任務到服務端的模式。服務端接收到我們的任務信息,先放入任務隊列、然后執行任務(申請資源、task分配、任務調度)。