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