Hadoop能夠說是一個大型的操做系統,HDFS就是其文件系統,那麼YARN就是其計算系統。
YARN (Yet Another Resource Negotiator,另外一種資源協調者)是一種新的 Hadoop 資源管理器。在此以前是使用MapReduce 1.0
MapReduce 1.0和MapReduce 2.0(YARN)的區別:
MapReduce 1.0
後臺進程有:
1.JobTracker
用於處理做業(用戶提交代碼)的後臺程序
決定有哪些文件參與處理,而後切割task並分配結點,原則是就近運行
監控task,重啓失敗task
每一個集羣只有惟一一個JobTracker
2.TaskTracker
根datanode經過節點
管理各自節點上的task(由JobTracker分配)
每一個節點只有一個TaskTracker,但一個TaskTracker能夠啓動多個JVM,用於並行執行map或reduce任務 node
MapReduce 2.0(YARN)web
YARN分紅兩部分:集羣資源管理和MapReduce
在YARN裏,JobTracker被分爲兩個服務:
第一部分:
1.ResourceManager,一個長期運行的YARN服務,負責接受application和在集羣上運行application。一個MapReduce做業(job)就是一個application。
2.JobHistoryServer,提供已完成的做業的信息。
3.Application Master,管理每一個MapReduce做業,看成業完成Application Master則關閉。
4.NodeManger替代了TaskTracker,是一個YARN服務,部署在節點上,負責管理該節點的資源。還負責啓動container(一個map任務或是reduce任務) shell
新的架構將JobTacker分爲ResourceManage和ApplicationMaster。
ResourceManage能夠跨application管理資源的利用。
ApplicationMaster負責管理做業(job)的執行。
這樣的架構,打破了以前的瓶頸,讓Hadoop機器能夠擴展到比4000個節點海大。
這種體系結構還容許同時執行各類編程模型,如圖形處理、迭代處理、機器學習和通常的集羣計算(包括傳統的MapReduce)。apache
YARN的基本理念是將 資源管理 和 做業調度/監控 的功能拆分爲多個守護進程。因此有了全局的ResourceManager(RM)和每一個application的的ApplicationMaster(AM)。一個application是一個獨立做業或則是DAG做業。 編程
ResourceManager和NodeManager組成了數據計算框架(data-computation framework)。ResourceManager有最高權利能夠仲裁全部application之間的資源。在這框架裏,NodeManager至關因而一個agent,負責容器化、監控資源的使用(cpu, 內存, 磁盤,網絡)並彙報給ResourceManager/Scheduler.安全
因此到如今,咱們就有術語:網絡
每一個application的ApplicationMaster(AM),其實是一個特殊的框架類庫,AM的任務就是與RM協商資源,並與NodeManager一塊兒執行和監視task。架構
ResourceManager有兩部分組成:Schedule和ApplicationManagerapp
Scheduler 負責分配資源給各個application,這些application都是要受一樣的容量、隊列等限制。
Scheduler是純調度,不負責任何監視和跟蹤application的狀態。一樣的,它也不會負責重啓那些由於application失敗或硬件崩潰致使失敗的任務。Scheduler是根據application資源需求來執行調度功能;是根據資源Container(容器)這個抽象概念來進行調度資源,這Container對應着內存、CPU、磁盤和網絡等。
Scheduler有個插件策略(pluggable policy),能夠本身配置調度器來決定在隊列之間、應用之間的集羣資源的分配。現有調度器是CapacityScheduler和FairScheduler。框架
ApplicationsManager負責接收job的提交,協調第一個容器來執行ApplicationMaster,並且提供ApplicationMaster的失敗重啓功能。每一個application對應的ApplicationMaster負責與Scheduler來協商請求合適的資源,負責跟蹤application的狀態和監控進度。
hadoop-2.x的MapReduce維護的API兼容hadoop-1.x。這意味着全部MapReduce job能夠不用修改,只須要從新編譯,便可在YARN上執行。
YARN經過ReservationSystem支持資源保留(resource reservation) 功能,該ReservationSystem容許用戶指定資源超時和時間限制(如deadline),來保留資源以確保重要的job可以可預測執行(predictable execution)。ReservationSystem跟蹤資源超時,權限控制,並動態指示底層調度器來確保資源保留(resource reservation)功能的執行。
爲了YARN可以擴展超過上千個節點,YARN提供Federation功能。Federation容許多個YARN集羣自動匹配,讓他們成爲一個巨大的集羣。這樣就能夠達到更大的擴展,容許多個獨立的集羣協做起來執行更大的做業。
RM負責跟蹤集羣的資源和調度application(如MapReduce做業)。在Hadoop2.4版本以前,ResourceManager在集羣中只有一個,因此會有單點失敗的可能。2.4版本後添加多一個ResourceManager,組成 Active/Standby ResourceManager來實現高可用。
ResourceManager高可用實現方式是Active/Standby架構。任什麼時候候,只能有一個RM是active,剩餘的RM是standby模式(時刻準備接替active的RM)。故障轉移能夠經過控制檯(手動)或故障轉移控制器(自動)。
當自動故障轉移功能沒有啓動時,能夠在控制檯指定一個RM是active。步驟以下:先將一個active的RM置爲standby,而後將一個standby轉爲active。都是經過"yarn rmadmin"命令。
查看RM狀態的命令
yarn rmadmin -getServiceState rm1
基於ZooKeeper的ActiveStandbyElector來決定哪一個RM稱爲active。當active的RM崩潰或者是沒響應時,其餘RM會自動被選擇爲active來接替故障的RM。注意,這裏跟HDFS的高可用不同,HDFS是單獨運行ZKFC守護進程。而ActiveStandbyElector是嵌入在RM裏的。
當有多個RM的時候,能夠在客戶端和NM的配置文件yarn-site.xml將全部的RM列出。客戶端、ApplicationMaster(AM)和NodeManager(NM)會以 round-robin的形式去逐個訪問RM,直至找到active的RM。當active崩潰時,客戶端它們會繼續 round-robin去找出active的「新」active的RM。這些邏輯都寫在這個類裏s org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider。若是修改這邏輯能夠實現該接口 org.apache.hadoop.yarn.client.RMFailoverProxyProvide,並將 yarn.client.failover-proxy-provider參數配置爲該類的類名。
standby的RM都會將全部的web請求重定向到active的RM(除了about的頁面)。
Web Services 也同樣,會將全部的web請求重定向到active的RM。
ResourceManager是中央式的管理資源和調度application。因此重啓ResourceManager時,須要保證整個YARN保持正常運做,且停機時對用戶是不可見。
總體思路是:當RM關閉時,會將已提交的application的元數據(如ApplicationSubmissionContext)保存在插件化的state-store,也會保存application的最終完成狀態(如failed, killed, finished),若是application是完成狀態的,也會保存其分析信息。若是是在安全環境,會保存證書,如security keys和token等。
在RM啓動時,RM會重建整個集羣的運行狀態,數據有從state-store獲取以前關閉時的信息,而後RM會發送re-sync命令到全部的NodeManager和ApplicationMaster,RM的中心調度器會去跟蹤全部容器的生命週期,applications的headroom和資源請求,隊列資源使用狀況。在NodeManager和ApplicationMaster收到re-sync,NM會返回容器狀態,ApplicationMaster會返回application的調度狀況,必要時還會從新請求資源(在請求資源的時候RM重啓沒收到的狀況)。
啓動RM的重啓配置:
<property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property>
state-store的配置
屬性 | 值 |
---|---|
yarn.resourcemanager.store.class | org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore org.apache.hadoop.yarn.server.resourcemanager.recovery.FileSystemRMStateStore(默認值) org.apache.hadoop.yarn.server.resourcemanager.recovery.LeveldbRMStateStore |
org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore是基於ZooKeeper的state-store:雖然能夠自由指定state-store,但若是要開啓HA功能,就只能用ZooKeeper,這是由於基於ZooKeeper的state-store支持fencing機制來避免腦裂。
org.apache.hadoop.yarn.server.resourcemanager.recovery.FileSystemRMStateStore是基於文件系統的state-store:支持HDFS和本地文件系統,但fencing機制不支持。
org.apache.hadoop.yarn.server.resourcemanager.recovery.LeveldbRMStateStore是基於LevelDB的state-store:被認爲是比上面兩個還輕量級。LevelDB支持更好的原子操做,更少的IO,使用更少的文件,但fencing機制不支持。
這裏只說基於ZooKeeper的state配置:
<property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> <!-- 配置zookeeper的地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>s1.jevoncode.com:2181,s2.jevoncode.com:2181,s3.jevoncode.com:2181</value> <description>For multiple zk services, separate them with comma</description> </property>
1.配置mapred-site.xml
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <!--指定mapreduce運行在yarn上--> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
2.配置yarn-site.xml
<?xml version="1.0"?> <configuration> <!-- 開啓YARN的HA --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!-- 指定兩個resourcemanager的名稱 --> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!-- 配置rm1,rm2的主機 --> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>s1.jevoncode.com</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>s3.jevoncode.com</value> </property> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <!--執行rm恢復機制實現類--> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> <!-- 配置zookeeper的地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>s1.jevoncode.com:2181,s2.jevoncode.com:2181,s3.jevoncode.com:2181</value> <description>For multiple zk services, separate them with comma</description> </property> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yarn-ha</value> </property> <property> <name>yarn.resourcemanager.hostname</name> <value>s1.jevoncode.com</value> </property> </configuration>
3.配置slave
s4.jevoncode.com s5.jevoncode.com s6.jevoncode.com
4.在s1啓動yarn
start-yarn.sh
5.在s3啓動standby的resourcemanager
yarn-daemon.sh start resourcemanager
6.此時就能查看到ResourceManager頁面
http://s1.jevoncode.com:8088