Flink架构原理
一、流式任務執行過程
1.任務并行
? ? ?按照自己的理解,一個流程如下圖所示,除非經歷shuffle過程,否則流程并行度將由source的并行度決定,比如kafka分區數目,shuffle之后的并行度,可能會改變,Operator子任務(Task)彼此獨立,并且可以在不同的線程中執行,并且可能在不同的機器或容器上執行。
2.OperatorChain
? ? 原理同Spark 的Satge劃分相似,為了減少數據在傳輸過程中的序列化和反序列化損耗,將一些可以合并的Task進行合并,合并之后稱多個Task為一個OperatorChain,在遇到Shuffle和用戶編程時強制截斷時,不進行合并。
二、架構
1.組成
? ? a. JobClient是Flink程序和JobManager交互的橋梁(同Spark Driver),主要負責接收程序、解析程序的執行計劃、優化程序的執行計劃,然后提交執行計劃到JobManager。
? ? b.JobManager是一個進程,主要負責申請資源,協調以及控制整個job的執行過程,具體包括,調度任務、處理checkpoint、容錯等等,在接收到JobClient提交的執行計劃之后,針對收到的執行計劃,繼續解析,因為JobClient只是形成一個operaor層面的執行計劃,所以JobManager繼續解析執行計劃(根據算子的并發度,劃分task),形成一個可以被實際調度的由task組成的拓撲圖,如上圖被解析之后形成下圖的執行計劃,最后向集群申請資源,一旦資源就緒,就調度task到TaskManager。
? ? c.TaskManager是一個進程,及一個JVM(Flink用java實現)。主要作用是接收并執行JobManager發送的task,并且與JobManager通信,反饋任務狀態信息,比如任務分執行中,執行完等狀態,上文提到的checkpoint的部分信息也是TaskManager反饋給JobManager的。如果說JobManager是master的話,那么TaskManager就是worker主要用來執行任務。在TaskManager內可以運行多個task。多個task運行在一個JVM內有幾個好處,首先task可以通過多路復用的方式TCP連接,其次task可以共享節點之間的心跳信息,減少了網絡傳輸。
?
2.Task 執行
? ?Spark中每個Stage中的Task會被分配到一個Worker中的 -> Executor容器里面的 -> 一個線程池中被執行,Flink稱每個Executor為一個TaskManager,每個TaskManager中會有多個slot作為內存隔離:
Spark:Worker ?——> ? Executor ?——> ?線程池 ?——> ?線程
Flink: ?Worker ?——> ? TaskManager ?——> ?Slot ?——> ?線程
? ? Slot是TaskManager資源粒度的劃分,每個Slot都有自己獨立的內存。所有Slot平均分配TaskManger的內存,比如TaskManager分配給Solt的內存為8G,兩個Slot,每個Slot的內存為4G,四個Slot,每個Slot的內存為2G,值得注意的是,Slot僅劃分內存,不涉及cpu的劃分。同時Slot是Flink中的任務執行器(類似Storm中Executor),每個Slot可以運行多個task,而且一個task會以單獨的線程來運行。Slot主要的好處有以下幾點:
可以起到隔離內存的作用,防止多個不同job的task競爭內存。
Slot的個數就代表了一個Flink程序的最高并行度,簡化了性能調優的過程
允許多個Task共享Slot,提升了資源利用率,舉一個實際的例子,kafka有3個partition,對應flink的source有3個task,而keyBy我們設置的并行度為20,這個時候如果Slot不能共享的話,需要占用23個Slot,如果允許共享的話,那么只需要20個Slot即可(Slot的默認共享規則計算為20個)。
Slot 注意點:
a.隔離內存
b.Slot共享并不是必須配置,但是啟用可以加速任務執行
c. Task 共享同一個Slot,需要滿足:不同Task但是屬于同一個SlotShardingGroup,默認所有的Task屬于同一個default組
d.在不開啟Slot共享的情況下,Slot數量和Flink并行度相同,Slot 解析資料鏈接
————————————————
版權聲明:本文為CSDN博主「beTree_fc」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u013560925/article/details/91381822
總結
- 上一篇: 深入理解select、poll和epol
- 下一篇: Flink基本架构