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 解析資料鏈接

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章