Flink架構分析之資源分配


Task Slot

    Flink中每個真正執行任務的TaskManager都是一個JVM進程,其在多線程環境中執行一個或者多個子任務。為了控制一個JVM同時能運行的任務數量,flink引入了task slot的概念。每一個task solt代表了TaskManager資源的一個子集,比如,一個擁有3個solt的TaskManager,每一個solt可以使用1/3TM所管理的內存。進行資源分割意味着為子任務保留足夠的內存,從而避免與其他子任務進行競爭。注意:當前solt還不能分割cpu資源,僅僅對內存進行了分割。

    通過調整TMsolt的數量,用戶可以確定子任務的隔離程度,比如,每個TM只設置一個solt,那么就意味着每一個任務組都在單獨的JVM中執行。共用JVM的任務可以共享TCP鏈接,心跳消息,甚至可能共享數據集。

    默認情況下,flink允許子任務共享slot只要這些子任務屬於同一job。允許solt共享主要有以下兩方面的好處:

  • flink計算一個job所需solt數量時,只需要確定所其最大並行度(parallelism),而不用計算每一個任務的並行度的總和。
  • 能更好的利用資源,如果沒有solt共享,那些資源需求不大的map子任務將和資源需求更大的window占用相同的資源。

    當然Flink也提供了資源分組機制相關API,允許用戶避免非預期的資源共享。

  • startNewChain 從此operator開始新的資源共享鏈
  • disableChaining 禁止把此operator加入到資源共享鏈中
  • slotSharingGroup 把此operator加入到指定的資源共享組中

資源分配邏輯

下圖是fip6對架構改進過后JobManagerTaskManager主要交互圖,可見job在執行中通過SlotProvider(即Scheduler)向ResourceManager申請資源,RM協調TaskManager滿足JobManager資源請求。


下圖是資源申請詳細調用流程圖:

可見Execution在執行過程中,會根據是否設置資源共享組,考慮是否為多個Execution分配同一個Slot,其代碼邏輯在SlotSharingManager中。資源分配的時候優先考慮SlotPool中是否有已分配資源能滿足需求,如果不能再向ResourceManager申請。

Scheduler

  • 通過allocateSlotSlotPool申請資源
  • 通過returnLogicSlot釋放資源到SlotPool

SlotPool

與其他組件之間的交互:

  • Scheduler -> SlotPool: 調度器向SlotPool申請資源
  • SlotPool -> ResourceManager: SlotPool如果無法滿足資源請求,向RM發起申請
  • JobMaster -> SlotPool: 從TaskManager獲取的資源通過JobMaster分配給SlotPool

LogicalSlot

  • SingleLogicSlot包含一個SlotContext接口對象,PhysicalSlot接口繼承了SlotContext
  • 實現了PhysicalSlot.Payload接口,可以通過PhysicalSlot.tryAssignPayloadPhysicalSlot分配給LogicalSlot

PhysicalSlot


AllocatedSlot代表從TaskExecutor分配的資源一個資源槽,代表TaskExecutor上的一段資源。

如下代碼把PhysicalSlot分配給LogicalSlot

Slot資源共享

Flink實現了資源共享機制,相同資源組里的多個Execution可以共享一個Slot資源槽。具體共享機制又分兩種:

  • CoLocationGroup: 保證把JobVertices的第n個運行實例和其他相同組內的JobVertices第n個實例運作在相同的slot中。
  • SlotSharingGroup: 允許不同的JobVertices的部署在相同的Slot中,但這是一種寬約束,只是盡量做到不能完全保證。

SlotSharingManager

每一個sharingGroup組用一個SlotSharingManager對象管理資源共享與分配。普通的slotsharing根據組內的JobVertices id 查找是否已有可以共享的Slot,如果有則直接使用,否則申請新的Slot。colocal類型根據組內每個ExecutionVertex關聯的CoLocationConstraint查找是否有相同CoLocationConstraint約束已分配Slot可用(注:滿足CoLocationConstraint約束的同一個資源共享組內的各節點相同序號n的並行實例,共享相同的CoLocationConstraint對象)

其他相關類

  • CoLocationConstraint
  • SingleLogicalSlot
  • MultiTaskSlot


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM