YARN 組件
參考:Spark on Yarn | Spark,從入門到精通
YARN 采用 Master/Slave結構 ,包含ResourceManager 和 NodeManager
ResourceManager 是 Master;
NodeManager 是 Slave。
YARN的基本思想是將資源管理和作業調度/監視功能划分為單獨的守護進程。
其實現為擁有一個全局ResourceManager (RM)和每個應用程序的ApplicationMaster (AM)。
應用程序可以是單個作業,也可以是一組作業。
從大體看,YARN的調度架構可以分為兩層
第一層調度是ResourceManager 和 NodeManager;
第二層調度是 NodeManager 和 Container
通過采用雙層調度結構將 Scheduler 管理的資源由細粒度的 (cpu、內存、磁盤、網絡)變成了粗粒度的 Container,降低了負載。
在 App Manager 組件中也只需要管理 App Master,不需要管理任務調度執行的完整信息,同樣降低了負載。通過降低 ResourceManager 的負載,變相地提高了集群的擴展性。
ResourceManager和NodeManager構成數據計算框架。ResourceManager是在系統中的所有應用程序之間仲裁資源的最終權威。NodeManager是每台機器的框架代理,負責監視containers的資源使用情況(cpu、內存、磁盤、網絡),並向ResourceManager/Scheduler報告相同的情況。
每個應用程序ApplicationMaster實際上是一個特定於框架的庫,它的任務是與ResourceManager協商資源,並與NodeManager一起執行和監視任務。
ResourceManager有兩個主要組件:Scheduler和ApplicationsManager。
- Scheduler
Scheduler負責根據密集的容量、隊列等約束將資源分配給各種正在運行的應用程序。
Scheduler是純粹調度器,因為它不執行對應用程序狀態的監視或跟蹤。
此外,它也不能保證由於應用程序故障或硬件故障而重新啟動失敗的任務。
Scheduler根據應用程序的資源需求執行調度功能;
它是基於資源containers的抽象概念實現的,資源containers包含內存、cpu、磁盤、網絡等元素。 - ApplicationsManager
ApplicationsManager負責接受作業提交,協商執行特定於應用程序的ApplicationMaster的第一個容器,並提供在出現故障時重新啟動ApplicationMaster容器的服務。
每個應用程序ApplicationMaster負責與調度程序協商適當的資源容器,跟蹤它們的狀態並監視進度。
Yarn 的運作流程
- Client 向 ResourceManager 的 App Manager 提交應用並請求一個 AppMaster 實例;
- App Manager 向 Scheduler 獲取可以運行一個 Container 的 NodeManager
- Scheduler 返回一個可以運行一個 Container 的 NodeManager 給 App Manager
- App Manager 在返回對 NodeManager 上啟動一個Container,並在這個Container上啟動 App Master 實例
- App Master 向 App Manager注冊
- 完成注冊客戶端就可以查詢 ResourceManager 獲得自己 App Master 的詳情以及直接和 App Master 交互
- 根據交互情況 App Master 向 向App Manager 請求資源,即 Container
- App Manager 收到請求后從 Scheduler 獲取到分配資源的信息 返回給 App Master 。
- App Master在對應的 NodeManager 上啟動 Container 並執行 Task
- Container 執行過程中會把運行進度和狀態等信息發送給 AppMaster
- Client 和 App Master 交流應用的運行狀態、進度更新等信息
- 所有任務完后成 App Master 向 App Manager 取消注冊然后關閉,同時所有的 Container 也歸還給系統。
Scheduler 策略
Scheduler 策略 有下列幾種:FIFO Scheduler、Capacity Scheduler、Fair Scheduler
- FIFO Scheduler
如果沒有配置Scheduler 策略的話,所有的任務都提交到一個 default 隊列,根據它們的提交順序執行。
如果資源充足執行任務,若資源緊張就等待前面的任務執行完畢后釋放資源,這就是 FIFO Scheduler 先入先出的分配方式。
- Capacity Scheduler
Capacity Scheduler 是一種多租戶、彈性的分配方式。
支持多個隊列,每個隊列可配置一定量的資源,每個采用FIFO的方式調度。
每個租戶一個隊列,每個隊列可以配置能使用的資源上限與下限(如 50%,達到這個上限后即使其他的資源空置着,也不可使用),通過配置可以令隊列至少有資源下限配置的資源可使用。
- Fair Scheduler
Fair Scheduler 是一種公平的分配方式,所謂的公平就是集群會盡可能地按配置的比例分配資源給隊列。
Job1 提交給隊列 A,它占用了集群的所有資源。
接着 Job2 提交給了隊列 B,這時 Job1 就需要釋放它的一半的資源給隊列 A 中的 Job2 使用。
接着 Job3 也提交給了隊列 B,這個時候 Job2 如果還未執行完畢的話也必須釋放一半的資源給 Job3。
這就是公平的分配方式,在隊列范圍內所有任務享用到的資源都是均分的。
Yarn HA(容災備援)
- Container 故障:Resource Manager 可以分配其他的 Container 繼續執行
- App Master 故障:分配新的 Container,啟動 App Master,新的 App Master 從 App Manager 獲取相關恢復信息
- NodeManager 故障:移除這個節點,在其他的 NodeManager 重啟繼續任務。
- ResourceManager 故障:在 Yarn 集群中,ResourceManager 可以啟動多台,只有其中一台是 active 狀態的,其他都處於待命狀態。
這台 active 狀態的 ResourceManager 執行的時候會向 ZooKeeper 集群寫入它的狀態;
當它故障的時候這些 RM 首先選舉出另外一台 leader 變為 active 狀態,然后從 ZooKeeper 集群加載 ResourceManager 的狀態;
在轉移的過程中它不接收新的 Job,轉移完成后才接收新 Job。