2018年第24周-大數據的YARN

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

架構

YARN的基本理念是將 資源管理 和 做業調度/監控 的功能拆分爲多個守護進程。因此有了全局的ResourceManager(RM)和每一個application的的ApplicationMaster(AM)。一個application是一個獨立做業或則是DAG做業。 編程

ResourceManager和NodeManager組成了數據計算框架(data-computation framework)。ResourceManager有最高權利能夠仲裁全部application之間的資源。在這框架裏,NodeManager至關因而一個agent,負責容器化、監控資源的使用(cpu, 內存, 磁盤,網絡)並彙報給ResourceManager/Scheduler.安全

因此到如今,咱們就有術語:網絡

  • RM ResourceManager(資源管理器)
  • AM ApplicationMaster
  • NM NodeManager(節點管理器)
  • application(=job)
  • job(做業)

每一個application的ApplicationMaster(AM),其實是一個特殊的框架類庫,AM的任務就是與RM協商資源,並與NodeManager一塊兒執行和監視task。架構

ResourceManager

ResourceManager有兩部分組成:Schedule和ApplicationManagerapp

Scheduler

Scheduler 負責分配資源給各個application,這些application都是要受一樣的容量、隊列等限制。
Scheduler是純調度,不負責任何監視和跟蹤application的狀態。一樣的,它也不會負責重啓那些由於application失敗或硬件崩潰致使失敗的任務。Scheduler是根據application資源需求來執行調度功能;是根據資源Container(容器)這個抽象概念來進行調度資源,這Container對應着內存、CPU、磁盤和網絡等。
Scheduler有個插件策略(pluggable policy),能夠本身配置調度器來決定在隊列之間、應用之間的集羣資源的分配。現有調度器是CapacityScheduler和FairScheduler。框架

ApplicationsManager

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集羣自動匹配,讓他們成爲一個巨大的集羣。這樣就能夠達到更大的擴展,容許多個獨立的集羣協做起來執行更大的做業。

ResourceManager高可用

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裏的。

客戶端、ApplicationMaster和NodeManager在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參數配置爲該類的類名。

ResourceManager 的Web界面

standby的RM都會將全部的web請求重定向到active的RM(除了about的頁面)。

Web Services

Web Services 也同樣,會將全部的web請求重定向到active的RM。

ResourceManager的重啓

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重啓沒收到的狀況)。

ResourceManager的重啓的配置

啓動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>
     

YARN部署

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
相關文章
相關標籤/搜索