Yarn的實現(xiàn)原理
Yarn作為分布式集群的資源調度框架,它的出現(xiàn)伴隨著Hadoop的發(fā)展,使Hadoop從一個單一的大數(shù)據(jù)計算引擎,成為一個集存儲、計算、資源管理為一體的完整大數(shù)據(jù)平臺,進而發(fā)展出自己的生態(tài)體系,成為大數(shù)據(jù)的代名詞。
所以在我們開始聊Yarn的實現(xiàn)原理前,有必要看看Yarn發(fā)展的過程,這對你理解Yarn的原理以及為什么被稱為資源調度框架很有幫助。我們在學習的MapReduce的架構時,MapReduce應用程序的啟動過程,最重要的就是要把MapReduce程序分發(fā)到大數(shù)據(jù)集群的服務器上,在Hadoop 1中,這個過程主要是通過TaskTracker和JobTracker通信來完成。
這個方案有什么缺點嗎?
這種架構方案的主要缺點是, 服務器集群資源調度管理和MapReduce執(zhí)行過程耦合在一起,如果想在當前集群中運行其他計算任務,比如Spark或者Storm,就無法統(tǒng)一使用集群中的資源了。
在Hadoop早期的時候,大數(shù)據(jù)技術就只有Hadoop一家,這個缺點并不明顯。但隨著大數(shù)據(jù)技術的發(fā)展,各種新的計算框架不斷出現(xiàn),我們不可能為每一種計算框架部署一個服務器集群,而且就算能部署新集群,數(shù)據(jù)還是在原來集群的HDFS上。所以我們需要把MapReduce的資源管理和計算框架分開,這也是Hadoop 2最主要的變化,就是將Yarn從MapReduce中分離出來,成為一個獨立的資源調度框架。
Yarn的架構組成
Yarn是“Yet Another Resource Negotiator”的縮寫,字面意思就是“另一種資源調度器”。事實上,在Hadoop社區(qū)決定將資源管理從Hadoop 1中分離出來,獨立開發(fā)Yarn的時候,業(yè)界已經(jīng)有一些大數(shù)據(jù)資源管理產(chǎn)品了,比如Mesos等,所以Yarn的開發(fā)者索性管自己的產(chǎn)品叫“另一種資源調度器”。這種命名方法并不鮮見,曾經(jīng)名噪一時的Java項目編譯工具Ant就是“Another Neat Tool”的縮寫,意思是“另一種整理工具”。
下圖是Yarn的架構。

從圖上看,Yarn包括兩個部分:一個是資源管理器(Resource Manager),一個是節(jié)點管理器(Node Manager)。這也是Yarn的兩種主要進程:ResourceManager進程負責整個集群的資源調度管理,通常部署在獨立的服務器上;NodeManager進程負責具體服務器上的資源和任務管理,在集群的每一臺計算服務器上都會啟動,基本上跟HDFS的DataNode進程一起出現(xiàn)。
具體說來,資源管理器又包括兩個主要組件:調度器和應用程序管理器。
調度器其實就是一個資源分配算法,根據(jù)應用程序(Client)提交的資源申請和當前服務器集群的資源狀況進行資源分配。Yarn內置了幾種資源調度算法,包括Fair Scheduler、Capacity Scheduler等,你也可以開發(fā)自己的資源調度算法供Yarn調用。
Yarn進行資源分配的單位是容器(Container),每個容器包含了一定量的內存、CPU等計算資源,默認配置下,每個容器包含一個CPU核心。容器由NodeManager進程啟動和管理,NodeManger進程會監(jiān)控本節(jié)點上容器的運行狀況并向ResourceManger進程匯報。
應用程序管理器負責應用程序的提交、監(jiān)控應用程序運行狀態(tài)等。應用程序啟動后需要在集群中運行一個ApplicationMaster,ApplicationMaster也需要運行在容器里面。每個應用程序啟動后都會先啟動自己的ApplicationMaster,由ApplicationMaster根據(jù)應用程序的資源需求進一步向ResourceManager進程申請容器資源,得到容器以后就會分發(fā)自己的應用程序代碼到容器上啟動,進而開始分布式計算。
工作流程
我們以一個MapReduce程序為例,來看一下Yarn的整個工作流程。
1.我們向Yarn提交應用程序,包括MapReduce ApplicationMaster、我們的MapReduce程序,以及MapReduce Application啟動命令。
2.ResourceManager進程和NodeManager進程通信,根據(jù)集群資源,為用戶程序分配第一個容器,并將MapReduce ApplicationMaster分發(fā)到這個容器上面,并在容器里面啟動MapReduce ApplicationMaster。
3.MapReduce ApplicationMaster啟動后立即向ResourceManager進程注冊,并為自己的應用程序申請容器資源。
4.MapReduce ApplicationMaster申請到需要的容器后,立即和相應的NodeManager進程通信,將用戶MapReduce程序分發(fā)到NodeManager進程所在服務器,并在容器中運行,運行的就是Map或者Reduce任務。
5.Map或者Reduce任務在運行期和MapReduce ApplicationMaster通信,匯報自己的運行狀態(tài),如果運行結束,MapReduce ApplicationMaster向ResourceManager進程注銷并釋放所有的容器資源。
MapReduce如果想在Yarn上運行,就需要開發(fā)遵循Yarn規(guī)范的MapReduce ApplicationMaster,相應地,其他大數(shù)據(jù)計算框架也可以開發(fā)遵循Yarn規(guī)范的ApplicationMaster,這樣在一個Yarn集群中就可以同時并發(fā)執(zhí)行各種不同的大數(shù)據(jù)計算框架,實現(xiàn)資源的統(tǒng)一調度管理。
Yarn 的設計原則
Yarn框架在架構設計上遵循一個重要的設計原則叫“ 依賴倒轉原則”,依賴倒轉原則是 高層模塊不能依賴低層模塊,它們應該共同依賴一個抽象,這個抽象由高層模塊定義,由低層模塊實現(xiàn)。
所謂高層模塊和低層模塊的劃分,簡單說來就是在調用鏈上,處于前面的是高層,后面的是低層。我們以典型的Java Web應用舉例,用戶請求在到達服務器以后,最先處理用戶請求的是Java Web容器,比如Tomcat、Jetty這些,通過監(jiān)聽80端口,把HTTP二進制流封裝成Request對象;然后是Spring MVC框架,把Request對象里的用戶參數(shù)提取出來,根據(jù)請求的URL分發(fā)給相應的Model對象處理;再然后就是我們的應用程序,負責處理用戶請求,具體來看,還會分成服務層、數(shù)據(jù)持久層等。
在這個例子中,Tomcat相對于Spring MVC就是高層模塊,Spring MVC相對于我們的應用程序也算是高層模塊。我們看到雖然Tomcat會調用Spring MVC,因為Tomcat要把Request交給Spring MVC處理,但是Tomcat并沒有依賴Spring MVC,Tomcat的代碼里不可能有任何一行關于Spring MVC的代碼。
那么,Tomcat如何做到不依賴Spring MVC,卻可以調用Spring MVC?如果你不了解框架的一般設計方法,這里還是會感到有點小小的神奇是不是?
秘訣就是Tomcat和Spring MVC都依賴J2EE規(guī)范,Spring MVC實現(xiàn)了J2EE規(guī)范的HttpServlet抽象類,即DispatcherServlet,并配置在web.xml中。這樣,Tomcat就可以調用DispatcherServlet處理用戶發(fā)來的請求。
同樣Spring MVC也不需要依賴我們寫的Java代碼,而是通過依賴Spring MVC的配置文件或者Annotation這樣的抽象,來調用我們的Java代碼。
所以,Tomcat或者Spring MVC都可以稱作是框架,它們都遵循依賴倒轉原則。
現(xiàn)在我們再回到MapReduce和Yarn。實現(xiàn)MapReduce編程接口、遵循MapReduce編程規(guī)范就可以被MapReduce框架調用,在分布式集群中計算大規(guī)模數(shù)據(jù);實現(xiàn)了Yarn的接口規(guī)范,比如Hadoop 2的MapReduce,就可以被Yarn調度管理,統(tǒng)一安排服務器資源。所以說,MapReduce和Yarn都是框架。
相反地,HDFS就不是框架,使用HDFS就是直接調用HDFS提供的API接口,HDFS作為底層模塊被直接依賴。
總結
Yarn作為一個大數(shù)據(jù)資源調度框架,調度的是大數(shù)據(jù)計算引擎本身。它不像MapReduce或Spark編程,每個大數(shù)據(jù)應用開發(fā)者都需要根據(jù)需求開發(fā)自己的MapReduce程序或者Spark程序。而現(xiàn)在主流的大數(shù)據(jù)計算引擎所使用的Yarn模塊,也早已被這些計算引擎的開發(fā)者做出來供我們使用了。
轉載:https://mp.weixin.qq.com/s/lGL-4u5PDeVS8M-cKYr9mg
本文使用 文章同步助手 同步
本文使用 文章同步助手 同步