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對架構改進過后JobManager與TaskManager主要交互圖,可見job在執行中通過SlotProvider(即Scheduler)向ResourceManager申請資源,RM協調TaskManager滿足JobManager資源請求。

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

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

SlotPool

與其他組件之間的交互:
- Scheduler -> SlotPool: 調度器向SlotPool申請資源
- SlotPool -> ResourceManager: SlotPool如果無法滿足資源請求,向RM發起申請
- JobMaster -> SlotPool: 從TaskManager獲取的資源通過JobMaster分配給SlotPool

LogicalSlot

SingleLogicSlot包含一個SlotContext接口對象,PhysicalSlot接口繼承了SlotContext- 實現了
PhysicalSlot.Payload接口,可以通過PhysicalSlot.tryAssignPayload把PhysicalSlot分配給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


