當前位置:編程學習大全網 - 源碼下載 - Flink之工作原理

Flink之工作原理

Flink作為新的stream計算引擎,這兩年社區的活躍度很高。對於Flink 既可以處理stream data也可以處理batch data,同時可以兼顧Spark以及Sparkstreaming的功能,與Spark不同的是,Flink本質上只有stream的概念,batch被認為是special stream。Flink主要有以下幾個角色需要大家了解,對於Flink的開發是很有幫助的。也便於自己後期翻閱。

JobClient:

負責接收程序,解析和優化程序的執行計劃,然後提交執行計劃到JobManager。這裏執行的程序優化是將相鄰的Operator融合,形成OperatorChain,Operator的融合可以減少task的數量,提高TaskManager的資源利用率。

JobManagers:

負責申請資源,協調以及控制整個job的執行過程,具體包括,調度任務、處理checkpoint、容錯等等

TaskManager:

TaskManager運行在不同節點上的JVM進程(process),負責接收並執行JobManager發送的task,並且與JobManager通信,反饋任務狀態信息,如果說JobManager是master的話,那麽TaskManager就是worker用於執行任務。每個TaskManager像是壹個容器

,包含壹個或者多個Slot。

Slot:

Slot是TaskManager資源粒度的劃分,每個Slot都有自己獨立的內存。所有Slot平均分配TaskManager的內存,值得註意的是,Slot僅劃分內存,不涉及cpu的劃分。每個Slot可以運行多個task。Slot的個數就代表了壹個程序的最高並行度。

Task:

Task是在operators的subtask進行鏈化之後形成的,具體Flink job中有多少task和operator的並行度和鏈化的策略有關,為了方便大家理解,可以參考圖5中所示的理解。

SubTask:

因為Flink是分布式部署的,程序中的每個算子,在實際執行中被分隔為壹個或者多個subtask,運算符子任務(subtask)的數量是該特定運算符的並行度。數據流在算子之間流動,就對應到SubTask之間的數據傳輸。Flink允許同壹個job中來自不同task的subtask可以***享同壹個slot。每個slot可以執行壹個並行的pipeline。可以將pipeline看作是多個subtask的組成的。

Flink程序本質上是並行和分布式的。在程序執行期間,壹個流會生成壹個或者多個stream partition,並且壹個operator會生成壹個或者多個operator subtask。operator的 subtask 彼此之間是獨立的,分別在不同的線程裏去執行並且可能分布在不同的機器上或者containers上。

operator的subtasks的數量等於該操作算子的並行度的數量。流的並行度有總是取決於產生它的操作算子的並行度決定的。同壹個flink程序中的不同的operators可能有不同的並行度。

數據流在兩個operators之間進行傳遞的方式有兩種:one-to-one 模式 和 redistributing 模式

①:one-to-one 模式:兩個operator用此模式傳遞的時候,會保持數據的分區數和數據的排序,比如:在下圖中Source和map() operators之間的數據傳遞方式;

②:Redistributing 模式:這種模式會改變數據的分區數;每個壹個operator subtask會根據選擇transformation把數據發送到不同的目標subtasks,比如keyBy()會通過hashcode重新分區,broadcast()和rebalance()方法會隨機重新分區,比如:在下圖中map()和keyBy/window ,keyBy/window和Sink之間的數據傳遞方式;

對於分布式計算,Flink將operator 的subtasks鏈化在壹起形成tasks。每個task在壹個線程中被執行。將operators鏈化在壹起形成tasks是比較好的壹個優化:他減少了線程和線程之間的切換和緩沖的開銷,增加了吞吐量降低了延遲。對於operator的鏈化行為,可以根據個人來去調整。詳情參考 官網

下圖中operators經過鏈化之後,僅僅需要5個並行的線程。

①每壹個worker(TaskManager) 都是壹個JVM進程,他可能會在獨立的線程中執行壹個或者多個subtask。為了控制worker能夠接收多個task。worker通過task slot來進行控制(壹個worker至少有壹個task slot)。

②每個task slot表示TaskManager擁有資源的壹個固定大小的子集。假如壹個TaskManager有三個slot,那麽它會將其管理的內存分成三份給各個slot。slot的資源化意味著壹個job的subtask將不需要跟來自其它job的subtask競爭被管理的內存。

③通過調整task slots的數量,用戶可以定義subtasks它們之間如何互相隔離。如果壹個TaskManager壹個slot,那將意味著每個task group獨立的運行在JVM中。而壹個TaskManager多個slot意味著更多的subtask可以***享壹個JVM。而在同壹個JVM進程中的task將***享TCP連接和心跳消息。它們也可能***享數據集和數據結構,這樣可以減少每個task的負載。

默認,如果subtask是來自相同的job,但不是相同的task,Flink允許subtask***享slot。這樣就會出現壹個slot可能容納壹個job中的整個pipeline。允許slot***享有以下兩個好處:

① Flink集群需要的task slots的數量和作業中的最高並行度的壹致。不需要計算壹個程序總***包含多少個task。

②更好的利用資源。如果沒有slot***享,非密集型source/map()子任務將阻塞與資源密集型窗口子任務壹樣多的資源;在slot***享的話,將我們圖6的示例中的基本並行度從2提高到6,可以充分利用slot資源,同時確保繁重的subtasks在Taskmanager中公平分配。

  • 上一篇:十進制28轉換成8421BCD碼,求過程
  • 下一篇:市面上的智能播放器和傳統播放器各占壹半,妳會怎麽選?
  • copyright 2024編程學習大全網