本文檔簡要概述 YARN ReservationSystem
。
YARN 的 ReservationSystem
使用者可以在時間內(和時間之前)預約資源,以確保重要的生產工作可以非常可預測地執行。ReservationSystem 執行仔細的准入控制,並提供對絕對資源數量(而不是群集大小的 %)的保證。預約可以是可變的,也可以有群組語意,並且可以有隨時間變化的資源需求。ReservationSystem 是 YARN ResourceManager 的組成部分。
參照上圖,典型的預約進行如下
步驟 0 使用者(或其代表的自動化工具)提交預約建立要求,並收到包含預約 ID 的回應。
步驟 1 使用者(或其代表的自動化工具)提交由預約定義語言 (RDL) 和從上一步中檢索的預約 ID 指定的預約要求。這描述了使用者對資源的時序需求(例如,資源的輪廓)和時間限制(例如,期限)。這可以使用戶端對 RM 協定或透過 RM 的 REST API 以程式化方式完成。如果提交的預約具有相同的預約 ID,且 RDL 相同,則不會建立新的預約,且要求會成功。如果 RDL 不同,則預約會被拒絕,且要求會失敗。
步驟 2 ReservationSystem 透過 ReservationAgent(圖中的 GREE)在 Plan 中尋找可行的配置,Plan 是追蹤目前已接受的預約和系統中可用資源的資料結構。
步驟 3 SharingPolicy 提供一個方法來強制執行已接受預約的不變式,可能會拒絕預約。例如,CapacityOvertimePolicy 允許強制執行使用者在所有預約中可以要求的瞬時最大容量,以及一段時間內資源積分的限制,例如,使用者可以立即預約最多 50% 的叢集容量,但在任何 24 小時期間,他/她不能超過 10% 的平均值。
步驟 4 在成功驗證後,ReservationSystem 會傳回 ReservationId 給使用者(可以將其視為機票)。
步驟 5 在適當時機,一個稱為 PlanFollower 的新元件會透過動態建立/調整/銷毀佇列,將計畫狀態發布到排程器。
步驟 6 然後,使用者可以透過將 ReservationId 納入 ApplicationSubmissionContext 的一部分,將一個(或多個)工作提交到可預約佇列。
步驟 7 然後,排程器會從一個特別建立的佇列提供容器,以確保資源預約受到尊重。在預約限制內,使用者有保證的資源存取權,在該資源之上,資源共享會繼續進行標準的容量/公平共享。
步驟 8 系統包含適應叢集容量下降的機制。這包括透過「移動」預約(如果可能)或拒絕先前接受預約中最小的數量(以確保其他預約將收到其全部數量)來重新規劃。
設定 ReservationSystem
很簡單。目前我們已在 CapacityScheduler
和 FairScheduler
中新增對預約的支援。您可以在 capacity-scheduler.xml 或 fair-scheduler.xml 中將任何葉狀佇列標記為可供「預約」(請參閱 CapacityScheduler 和 FairScheduler 以取得詳細資訊)。然後,該佇列中的容量/公平份額可用於進行預約。工作仍然可以在沒有預約的情況下提交到可預約佇列,在這種情況下,它們將以盡力而為模式在活躍預約中執行的工作的剩餘容量中執行。