9.一文搞定Flink中的重要概念

1.前言

截止到目前為止,基本上所有與FLink 中DateStream API相關(guān)的內(nèi)容都介紹完畢了,如果你一直看到這里證明很多東西你都已經(jīng)理解了。我在表述的過程中也是一直用的最基本的話語去進行描述的,相信讀起來也并不費力。這篇文章可以說的上是這一部分知識的一個分水嶺,因為在講完了所有的重要概念之后,就要進入到Flink SQL的講述階段了,所以希望你可以認(rèn)真看,且看且珍惜。


2.重要概念

2.1 數(shù)據(jù)流圖(dataflow graph)

flink本身實際上就是對實時的數(shù)據(jù)進行計算處理的一個框架,它所做的就是每來一條數(shù)據(jù),就要讓這條數(shù)據(jù)按照規(guī)定好的執(zhí)行流程計算一次,多個能進行數(shù)據(jù)處理的算子組合在一起就形成了一個能夠讓數(shù)據(jù)按流程處理的算子管道。在這個管道中,會按照對處理處理功能不同的切割成為source、transformation、sink。它們?nèi)齻€就主要負(fù)責(zé)數(shù)據(jù)的讀、算、寫三個階段。
當(dāng)作業(yè)被提交之后,F(xiàn)Link程序就會按照編寫好的代碼邏輯,將整個計算過程映射成為一個具備所有算子的邏輯順序圖。這個圖是個有序無環(huán)圖,它由一個或多個source算子開始,經(jīng)過轉(zhuǎn)換算子的處理之后,再由一個或多個sink算子寫出。

2.2 并行度

并行度在Flink中是一個重要的概念,在Flink進行數(shù)據(jù)處理的時候,會將不同的算子分配到不同的節(jié)點上進行計算,雖然這種做法對任務(wù)進行了均攤,但是性能提升還是有限的,因為算子與算子之間是有先后順序的,一條數(shù)據(jù)必須依次執(zhí)行才能完成計算。而在使用了并行度這個概念之后,F(xiàn)Link會把一個算子任務(wù)按照并行度的數(shù)量在多個節(jié)點進行復(fù)制,數(shù)據(jù)來了之后就能夠進入到任意一個節(jié)點上進行計算,這樣也就把一個算子任務(wù)變成了多個算子任務(wù),這些多個算子任務(wù)就叫做并行子任務(wù),只要多個并行的子任務(wù)被分配到了不同的節(jié)點,那就是真正的實現(xiàn)了并行計算。而每一個算子的并行子任務(wù)個數(shù),就是它的并行度。一個并行度就需要一個分區(qū)來進行處理,一個計算流程中算子的最大的并行度,就是這個計算流程的最大并行度。

在Flink中對并行度的設(shè)置有很多種方法,他們的優(yōu)先級如下:
算子單獨的并行度 > 代碼全局并行度 > 提交時并行度 > 配置文件中并行度

2.3 算子鏈

在處理數(shù)據(jù)的過程中,可能會有很多算子的出現(xiàn),這些算子對數(shù)據(jù)進行處理的時候可能會面臨兩種情況,第一種情況就是一對一模式,在這種模式下,元素的順序是不會發(fā)生變化的,也不需要進行重新的分區(qū)。第二種情況就是重分區(qū)模式,數(shù)據(jù)的順序會發(fā)生變化,分區(qū)也可能會發(fā)生變化。
在Flink中,并行度一對一的算子操作,可以直接鏈接起來形成一個大的任務(wù),所有在這個任務(wù)里面的算子都變成了這個任務(wù)的一部分,這個任務(wù)會被一個線程執(zhí)行,這個技術(shù)就是算子鏈。通過這個技術(shù),可以十分有效的減少線程之間的切換和基于緩沖區(qū)之間的數(shù)據(jù)交換的時間。這種模式也可以通過代碼顯示禁用。

//禁用算子
.disableChaining();
//從當(dāng)前算子開新鏈
.startNewChain()

2.4 圖

圖概念是FLink處理數(shù)據(jù)的時候一個很重要的概念,當(dāng)代碼被提交之后,首先要做的事情就是把代碼映射成為邏輯流圖,然后在邏輯流圖的基礎(chǔ)之上再進行變化,具體的變化過程如下:
邏輯流圖-->作業(yè)圖--->執(zhí)行圖--->物理圖

1.邏輯流圖
邏輯流圖是通過api代碼生成的最初的DAG圖,用來標(biāo)識程序的拓?fù)浣Y(jié)構(gòu),這個步驟在客戶端完成。

2.作業(yè)圖
在邏輯流圖的基礎(chǔ)上進行優(yōu)化,就得到了作業(yè)圖,它確定了當(dāng)前作業(yè)中所有任務(wù)的劃分。主要的優(yōu)化為: 將多個符合條件的節(jié)點鏈接在一起合并成一個任務(wù)節(jié)點,形成算子鏈,這樣可以減少數(shù)據(jù)交換的消耗。JobGraph 一般也是在客戶端生成的,在作業(yè)提交時傳遞給 JobMaster。

3.執(zhí)行圖
JobMaster 收到 JobGraph 后,會根據(jù)它來生成執(zhí)行圖(ExecutionGraph)。ExecutionGraph是 JobGraph 的并行化版本,是調(diào)度層最核心的數(shù)據(jù)結(jié)構(gòu)。

4.物理圖
JobMaster 生成執(zhí)行圖后, 會將它分發(fā)給 TaskManager;各個 TaskManager 會根據(jù)執(zhí)行圖部署任務(wù),最終的物理執(zhí)行過程也會形成一張“圖”,一般就叫作物理圖(Physical Graph)。這只是具體執(zhí)行層面的圖,并不是一個具體的數(shù)據(jù)結(jié)構(gòu)。

2.5 任務(wù)槽和任務(wù)

任務(wù)槽solt是每一個TM上資源的一個子集,它是TM一組資源的封裝。在現(xiàn)階段,這種封裝只限于內(nèi)存的隔離,并不會涉及到CPU的隔離,可以在開發(fā)的過程中按照CPU線程的數(shù)量來設(shè)置solt的數(shù)量。在TM工作的時候,可以通過讓TM開啟并行度來實現(xiàn)多線程執(zhí)行任務(wù),這個TM能開啟的線程數(shù),就對應(yīng)著它能夠同時處理多少個并行子任務(wù)。如果一個TM能按照等量資源劃分成為3個solt,那么兩個TM就能夠處理并行子任務(wù)數(shù)量總數(shù)小于等于6個的計算邏輯。但是一個TM劃分出來的并行度越多,單一并行度的資源就越少,所以為了控制并發(fā)量,所以就需要通過任務(wù)槽的概念來幫助TM對每個任務(wù)運行的資源進行劃分。

為了能夠更好的運用集群的資源,任務(wù)還能夠?qū)θ蝿?wù)槽進行共享。FLink中規(guī)定,面對同一計算任務(wù),可以將不同的計算節(jié)點放置到相同的solt上執(zhí)行,也就是說一個計算邏輯的最大并行度數(shù)量是不能夠超過TM的任務(wù)槽數(shù)量的。因為一旦超過,多余的子任務(wù)就沒有放置他們的資源了,這個時候就會進入等待狀態(tài)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容