Flink系統架構

  原文連接:一文弄懂Flink基礎理論redis

 

  Flink分佈式程序包含2個主要的進程:JobManager和TaskManager.當程序運行時,不一樣的進程就會參與其中,包括Jobmanager、TaskManager和JobClient。api

 

 

 

  當 Flink 集羣啓動後,首先會啓動一個 JobManger 和一個或多個的 TaskManager。由 Client 提交任務給 JobManager,JobManager 再調度任務到各個 TaskManager 去執行,而後 TaskManager 將心跳和統計信息彙報給 JobManager。TaskManager 之間以流的形式進行數據的傳輸。上述三者均爲獨立的 JVM 進程。架構

 

JobManagerapp


Master進程,負責Job的管理和資源的協調。包括任務調度,檢查點管理,失敗恢復等。
分佈式

固然,對於集羣HA模式,能夠同時多個master進程,其中一個做爲leader,其餘做爲standby。當leader失敗時,會選出一個standby的master做爲新的leader(經過zookeeper實現leader選舉)。優化

JobManager包含了3個重要的組件:spa

###(1)Actor系統.net

Flink內部使用Akka模型做爲JobManager和TaskManager之間的通訊機制。線程

Actor系統是個容器,包含許多不一樣的Actor,這些Actor扮演者不一樣的角色。Actor系統提供相似於調度、配置、日誌等服務,同時包含了全部actors初始化時的線程池。日誌

全部的Actors存在着層級的關係。新加入的Actor會被分配一個父類的Actor。Actors之間的通訊採用一個消息系統,每一個Actor都有一個「郵箱」,用於讀取消息。若是Actors是本地的,則消息在共享內存中共享;若是Actors是遠程的,則消息經過RPC遠程調用。

每一個父類的Actor都負責監控其子類Actor,當子類Actor出現錯誤時,本身先嚐試重啓並修復錯誤;若是子類Actor不能修復,則將問題升級並由父類Actor處理。

在Flink中,actor是一個有狀態和行爲的容器。Actor的線程持續的處理從「郵箱」中接收到的消息。Actor中的狀態和行爲則由收到的消息決定。

 

 

 


###(2)調度
Flink中的Executors被定義爲task slots(線程槽位)。每一個Task Manager須要管理一個或多個task slots。
Flink經過SlotSharingGroup和CoLocationGroup來決定哪些task須要被共享,哪些task須要被單獨的slot使用。
###(3)檢查點



Flink的檢查點機制是保證其一致性容錯功能的骨架。它持續的爲分佈式的數據流和有狀態的operator生成一致性的快照。Flink的容錯機制持續的構建輕量級的分佈式快照,所以負載很是低。一般這些有狀態的快照都被放在HDFS中存儲(state backend)。程序一旦失敗,Flink將中止executor並從最近的完成了的檢查點開始恢復(依賴可重發的數據源+快照)。

參考:三分鐘掌握Flink基本概念和原理

運行架構

經常使用的類型和操做

 

 

 

參考:
Flink 原理與實現:數據流上的類型和操做:http://wuchong.me/blog/2016/05/20/flink-internals-streams-and-operations-on-streams
Flink Stream 算子:https://flink.sojb.cn/dev/stream/operators

程序結構介紹

 

 

 


Source,它是整個stream的入口。
Transformation,用於轉換一個或多個DataStream從而造成一個新的DataStream對象。
Sink,它流的數據出口。


 

並行數據流

  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每一個算子均可以設置並行度,而後就是也能夠設置全局並行度。
api設置.map(new RollingAdditionMapper()).setParallelism(10)
全局配置在flink-conf.yaml文件中,parallelism.default,默認是1


Task and Operator Chains

爲了更高效地分佈式執行,Flink會盡量地將operator的subtask連接(chain)在一塊兒造成task。每一個task在一個線程中執行。將operators連接成task是很是有效的優化:它能減小線程之間的切換,減小消息的序列化/反序列化,減小數據在緩衝區的交換,減小了延遲的同時提升總體的吞吐量。

 

 

 

能夠進行Operator chains的條件一、上下游的並行度一致二、下游節點的入度爲1 (也就是說下游節點沒有來自其餘節點的輸入)三、上下游節點都在同一個 slot group 中(下面會解釋 slot group)四、下游節點的 chain 策略爲 ALWAYS(能夠與上下游連接,map、flatmap、filter等默認是ALWAYS)五、上游節點的 chain 策略爲 ALWAYS 或 HEAD(只能與下游連接,不能與上游連接,Source默認是HEAD)六、兩個節點間數據分區方式是 forward(參考理解數據流的分區)七、用戶沒有禁用 chain————————————————

相關文章
相關標籤/搜索