更快、更強——解析Hadoop新一代MapReduce框架Yarn(CSDN)

摘要:本文介紹了Hadoop 自0.23.0版本後新的MapReduce框架(Yarn)原理、優點、運做機制和配置方法等;着重介紹新的Yarn框架相對於原框架的差別及改進。html

編者按:對於業界的大數據存儲及分佈式處理系統來講,Hadoop 是耳熟能詳的卓越開源分佈式文件存儲及處理框架,對於 Hadoop 框架的介紹在此再也不累述,隨着需求的發展,Yarn 框架浮出水面,@依然光榮復興的 博客給咱們作了很詳細的介紹,讀者經過本文中新舊 Hadoop MapReduce 框架的對比,更能深入理解新的 yarn 框架的技術原理和設計思想。 node

 

背景

Yarn是一個分佈式的資源管理系統,用以提升分佈式的集羣環境下的資源利用率,這些資源包括內存、IO、網絡、磁盤等。其產生的緣由是爲了解決原MapReduce框架的不足。最初MapReduce的committer們還能夠週期性的在已有的代碼上進行修改,但是隨着代碼的增長以及原MapReduce框架設計的不足,在原MapReduce框架上進行修改變得愈來愈困難,因此MapReduce的committer們決定從架構上從新設計MapReduce,使下一代的MapReduce(MRv2/Yarn)框架具備更好的擴展性、可用性、可靠性、向後兼容性和更高的資源利用率以及能支持除了MapReduce計算框架外的更多的計算框架。apache

 

原MapReduce框架的不足(--Hadoop雖然強大,但不是萬能的--)

  • JobTracker是集羣事務的集中處理點,存在單點故障
  • JobTracker須要完成的任務太多,既要維護job的狀態又要維護job的task的狀態,形成過多的資源消耗
  • 在taskTracker端,用map/reduce task做爲資源的表示過於簡單,沒有考慮到CPU、內存等資源狀況,當把兩個須要消耗大內存的task調度到一塊兒,很容易出現OOM
  • 把資源強制劃分爲map/reduce slot,當只有map task時,reduce slot不能用;當只有reduce task時,map slot不能用,容易形成資源利用不足

 

Yarn架構

Yarn/MRv2最基本的想法是將原JobTracker主要的資源管理和job調度/監視功能分開做爲兩個單獨的守護進程。有一個全局的ResourceManager(RM)和每一個Application有一個ApplicationMaster(AM),Application至關於map-reduce job或者DAG jobs。ResourceManager和NodeManager(NM)組成了基本的數據計算框架。ResourceManager協調集羣的資源利用,任何client或者運行着的applicatitonMaster想要運行job或者task都得向RM申請必定的資源。ApplicatonMaster是一個框架特殊的庫,對於MapReduce框架而言有它本身的AM實現,用戶也能夠實現本身的AM,在運行的時候,AM會與NM一塊兒來啓動和監視tasks。 網絡

ResourceManager

ResourceManager做爲資源的協調者有兩個主要的組件:Scheduler和ApplicationsManager(AsM)架構

Scheduler負責分配最少但知足application運行所需的資源量給Application。Scheduler只是基於資源的使用狀況進行調度,並不負責監視/跟蹤application的狀態,固然也不會處理失敗的task。RM使用resource container概念來管理集羣的資源,resource container是資源的抽象,每一個container包括必定的內存、IO、網絡等資源,不過目前的實現只包括內存一種資源。app

ApplicationsManager負責處理client提交的job以及協商第一個container以供applicationMaster運行,而且在applicationMaster失敗的時候會從新啓動applicationMaster。下面闡述RM具體完成的一些功能。框架

  1. 資源調度:Scheduler從全部運行着的application收到資源請求後構建一個全局的資源分配計劃,而後根據application特殊的限制以及全局的一些限制條件分配資源。
  2. 資源監視:Scheduler會週期性的接收來自NM的資源使用率的監控信息,另外applicationMaster能夠從Scheduler獲得屬於它的已完成的container的狀態信息。
  3. Application提交:
    • client向AsM得到一個applicationIDclient將application定義以及須要的jar包
    • client將application定義以及須要的jar包文件等上傳到hdfs的指定目錄,由yarn-site.xml的yarn.app.mapreduce.am.staging-dir指定
    • client構造資源請求的對象以及application的提交上下文發送給AsM
    • AsM接收application的提交上下文
    • AsM根據application的信息向Scheduler協商一個Container供applicationMaster運行,而後啓動applicationMaster
    • 向該container所屬的NM發送launchContainer信息啓動該container,也即啓動applicationMaster、AsM向client提供運行着的AM的狀態信息。
  4. AM的生命週期:AsM負責系統中全部AM的生命週期的管理。AsM負責AM的啓動,當AM啓動後,AM會週期性的向AsM發送heartbeat,默認是1s,AsM據此瞭解AM的存活狀況,而且在AM失敗時負責重啓AM,如果必定時間事後(默認10分鐘)沒有收到AM的heartbeat,AsM就認爲該AM失敗了。

關於ResourceManager的可用性目前尚未很好的實現,不過Cloudera公司的CDH4.4之後的版本實現了一個簡單的高可用性,使用了Hadoop-common項目中HA部分的代碼,採用了相似hdfs namenode高可用性的設計,給RM引入了active和standby狀態,不過沒有與journalnode相對應的角色,只是由zookeeper來負責維護RM的狀態,這樣的設計只是一個最簡單的方案,避免了手動重啓RM,離真正的生產可用還有一段距離。分佈式

NodeManager

NM主要負責啓動RM分配給AM的container以及表明AM的container,而且會監視container的運行狀況。在啓動container的時候,NM會設置一些必要的環境變量以及將container運行所需的jar包、文件等從hdfs下載到本地,也就是所謂的資源本地化;當全部準備工做作好後,纔會啓動表明該container的腳本將程序啓動起來。啓動起來後,NM會週期性的監視該container運行佔用的資源狀況,如果超過了該container所聲明的資源量,則會kill掉該container所表明的進程。oop

另外,NM還提供了一個簡單的服務以管理它所在機器的本地目錄。Applications能夠繼續訪問本地目錄即便那臺機器上已經沒有了屬於它的container在運行。例如,Map-Reduce應用程序使用這個服務存儲map output而且shuffle它們給相應的reduce task。大數據

在NM上還能夠擴展本身的服務,yarn提供了一個yarn.nodemanager.aux-services的配置項,經過該配置,用戶能夠自定義一些服務,例如Map-Reduce的shuffle功能就是採用這種方式實現的。

NM在本地爲每一個運行着的application生成以下的目錄結構:

 

Container目錄下的目錄結構以下: 

 

在啓動一個container的時候,NM就執行該container的default_container_executor.sh,該腳本內部會執行launch_container.sh。launch_container.sh會先設置一些環境變量,最後啓動執行程序的命令。對於MapReduce而言,啓動AM就執行org.apache.hadoop.mapreduce.v2.app.MRAppMaster;啓動map/reduce task就執行org.apache.hadoop.mapred.YarnChild。 

 

ApplicationMaster

ApplicationMaster是一個框架特殊的庫,對於Map-Reduce計算模型而言有它本身的ApplicationMaster實現,對於其餘的想要運行在yarn上的計算模型而言,必須得實現針對該計算模型的ApplicationMaster用以向RM申請資源運行task,好比運行在yarn上的spark框架也有對應的ApplicationMaster實現,歸根結底,yarn是一個資源管理的框架,並非一個計算框架,要想在yarn上運行應用程序,還得有特定的計算框架的實現。因爲yarn是伴隨着MRv2一塊兒出現的,因此下面簡要概述MRv2在yarn上的運行流程。

MRv2運行流程:

  1. MR JobClient向resourceManager(AsM)提交一個job
  2. AsM向Scheduler請求一個供MR AM運行的container,而後啓動它
  3. MR AM啓動起來後向AsM註冊
  4. MR JobClient向AsM獲取到MR AM相關的信息,而後直接與MR AM進行通訊
  5. MR AM計算splits併爲全部的map構造資源請求
  6. MR AM作一些必要的MR OutputCommitter的準備工做
  7. MR AM向RM(Scheduler)發起資源請求,獲得一組供map/reduce task運行的container,而後與NM一塊兒對每個container執行一些必要的任務,包括資源本地化等
  8. MR AM 監視運行着的task 直到完成,當task失敗時,申請新的container運行失敗的task
  9. 當每一個map/reduce task完成後,MR AM運行MR OutputCommitter的cleanup 代碼,也就是進行一些收尾工做
  10. 當全部的map/reduce完成後,MR AM運行OutputCommitter的必要的job commit或者abort APIs
  11. MR AM退出。

 

在Yarn上寫應用程序

在yarn上寫應用程序並不一樣於咱們熟知的MapReduce應用程序,必須牢記yarn只是一個資源管理的框架,並非一個計算框架,計算框架能夠運行在yarn上。咱們所能作的就是向RM申請container,而後配合NM一塊兒來啓動container。就像MRv2同樣,jobclient請求用於MR AM運行的container,設置環境變量和啓動命令,而後交由NM去啓動MR AM,隨後map/reduce task就由MR AM全權負責,固然task的啓動也是由MR AM向RM申請container,而後配合NM一塊兒來啓動的。因此要想在yarn上運行非特定計算框架的程序,咱們就得實現本身的client和applicationMaster。另外咱們自定義的AM須要放在各個NM的classpath下,由於AM可能運行在任何NM所在的機器上。

原文連接:Yarn詳解(責編:Arron)

相關文章
相關標籤/搜索