任何計算任務的執行都離不開計算資源,比如CPU、記憶體等,那麼如何對於計算資源的管理排程就成為了一個重點。巨量資料領域中的Hadoop之所以一家獨大,深受市場的歡迎,和他們設計了一個通用的資源管理排程平臺Yarn密不可分,那Yarn是如何做進行資源管理的呢?它的通用性體現在哪裡呢?它是如何保證Hadoop絕對的統治地位的呢?希望看了本文你心中有了答案。
在早期的Hadoop 1.0時代是沒有Yarn這東西的,計算任務MapReduce程式分發到巨量資料叢集中是通過 TaskTracker
和 JobTracker
通訊來完成,這有一個很大的缺點就是伺服器叢集資源排程管理和 MapReduce 執行過程耦合在一起,如果想在當前叢集中執行其他計算任務,比如 Spark 或者 Storm,就無法統一使用叢集中的資源了。後來聰明的Hadoop設計者們想能否將資源管理和計算任務分開,也可以執行別家公司的計算任務呢,這也是 Hadoop 2 最主要的變化,就是將 Yarn 從 MapReduce 中分離出來,成為一個獨立的資源排程框架。
Apache Hadoop YARN
(Yet Another Resource Negotiator
,另一種資源協調者)是一種新的Hadoop資源管理器。YARN是一個通用資源管理系統和排程平臺,可為上層應用提供統一的資源管理和排程。它的引入為叢集在利用率、資源統一管理和資料共用等方面帶來了巨大好處。
那麼如何理解YARN是一個通用資源管理系統和排程平臺?
可以把Hadoop YARN理解為相當於一個分散式的作業系統平臺,而MapReduce等計算程式則相當於執行於作業系統之上的應用程式,YARN為這些程式提供運算所需的資源(記憶體、CPU等)。 Hadoop能有今天這個地位,YARN可以說是功不可沒。因為有了YARN ,更多計算框架可以接入到 HDFS中,而不單單是 MapReduce,正是因為YARN的包容,使得其他計算框架能專注於計算效能的提升。
從圖上看,Yarn 包括兩個部分:一個是資源管理器(Resource Manager),一個是節點管理器(Node Manager)。
YARN叢集中的主角色,決定系統中所有應用程式之間資源分配的最終許可權,即最終仲裁者。接收使用者的作業提交,並通過NM分配、管理各個機器上的計算資源。
YARN中的從角色,一臺機器上一個,負責管理本機器上的計算資源。
根據RM命令,啟動Container容器、監視容器的資源使用情況。並且向RM主角色彙報資源使用情況。
Yarn 進行資源分配的單位是容器(Container
),每個容器包含了一定量的記憶體、CPU 等計算資源,預設設定下,每個容器包含一個 CPU 核心。容器由 NodeManager 程序啟動和管理,NodeManger 程序會監控本節點上容器的執行狀況並向 ResourceManger 程序彙報。
應用程式管理器負責應用程式的提交、監控應用程式執行狀態等。應用程式啟動後需要在叢集中執行一個 ApplicationMaster
,ApplicationMaster
也需要執行在容器裡面。每個應用程式啟動後都會先啟動自己的 ApplicationMaster
,由 ApplicationMaster
根據應用程式的資源需求進一步向 ResourceManager
程序申請容器資源,得到容器以後就會分發自己的應用程式程式碼到容器上啟動,進而開始分散式計算。
我們以一個 MapReduce 程式為例,來看一下 Yarn 的整個工作流程。
MapReduce ApplicationMaster
、我們的 MapReduce
程式,以及 MapReduce Application
啟動命令。2.ResourceManager
程序和 NodeManager
程序通訊,根據叢集資源,為使用者程式分配第一個容器,並將 MapReduce ApplicationMaster
分發到這個容器上面,並在容器裡面啟動 MapReduce ApplicationMaster
。
3.MapReduce ApplicationMaster
啟動後立即向 ResourceManager
程序註冊,併為自己的應用程式申請容器資源。
4.MapReduce ApplicationMaster
申請到需要的容器後,立即和相應的 NodeManager
程序通訊,將使用者 MapReduce
程式分發到 NodeManager
程序所在伺服器,並在容器中執行,執行的就是 Map 或者 Reduce 任務。
5.Map 或者 Reduce 任務在執行期和 MapReduce ApplicationMaster
通訊,彙報自己的執行狀態,如果執行結束,MapReduce ApplicationMaster
向 ResourceManager
程序登出並釋放所有的容器資源。
YARN還有一個作用就是進行資源排程,那麼如何理解資源排程?
Scheduler
,它是ResourceManager
的核心元件之一。Scheduler
完全專用於排程作業,它無法跟蹤應用程式的狀態。 Yarn中提供了三種排程器,FIFO Scheduler
(先進先出排程器)、Capacity Scheduler
(容量排程器)、Fair Scheduler
(公平排程器)。Apache版本YARN預設使用Capacity Scheduler
。
FIFO Scheduler
是一個先進先出的思想,即先提交的應用先執行。排程工作不考慮優先順序和範圍,適用於負載較低的小規模叢集。當使用大型共用叢集時,它的效率較低且會導致一些問題。
FIFO Scheduler
擁有一個控制全域性的佇列queue,預設queue名稱為default,該排程器會獲取當前叢集上所有的資源資訊作用於這個全域性的queue。
優勢:
壞處:
Capacity Scheduler
容量排程是Apache Hadoop3.x預設排程策略。該策略允許多個組織共用整個叢集資源,每個組織可以獲得叢集的一部分計算能力。通過為每個組織分配專門的佇列,然後再為每個佇列分配一定的叢集資源,這樣整個叢集就可以通過設定多個佇列的方式給多個組織提供服務了。
Capacity
可以理解成一個個的資源佇列,這個資源佇列是使用者自己去分配的。佇列內部又可以垂直劃分,這樣一個組織內部的多個成員就可以共用這個佇列資源了,在一個佇列內部,資源的排程是採用的是先進先出(FIFO)策略。
優勢
層次化的管理,可以更容易、更合理分配和限制資源的使用。
每個佇列上都可以設定一個資源的佔比,保證每個佇列都不會佔用整個叢集的資源。
每個佇列有嚴格的存取控制。使用者只能向自己的佇列裡面提交任務,而且不能修改或者存取其他佇列的任務。
空閒的資源可以被分配給任何佇列。 當多個佇列出現爭用的時候,則會按照權重比例進行平衡。
Fair Scheduler叫做公平排程,提供了YARN應用程式公平地共用大型叢集中資源的另一種方式。使所有應用在平均情況下隨著時間的流逝可以獲得相等的資源份額。
Fair Scheduler設計目標是為所有的應用分配公平的資源(對公平的定義通過引數來設定)。
公平排程可以在多個佇列間工作,允許資源共用和搶佔。
如何理解公平共用?
優勢
Yarn作為一個通用的資源管理平臺,簡單總結有兩大塊功能,一個是為計算任務分配CPU、記憶體等計算資源,另外一個是計算任務該什麼時候排程執行。但是它的格局更大,只要實現Yarn提供的程式設計規範,不僅能執行自己Hadoop的MapReduce計算任務,還可以執行其他比如Spark、Flink等其他產品的計算任務。所以這是一個非常優秀的平臺,或者說框架。
如果本文對你有幫助的話,請留下一個贊吧
歡迎關注個人公眾號——JAVA旭陽
更多學習資料請移步:程式設計師成神之路
本文來自部落格園,作者:JAVA旭陽,轉載請註明原文連結:https://www.cnblogs.com/alvinscript/p/16972891.html