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任务

MapReduce 2.0(YARN)

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任务)

新的架构将JobTacker分为ResourceManage和ApplicationMaster。
ResourceManage可以跨application管理资源的利用。
ApplicationMaster负责管理作业(job)的执行。
这样的架构,打破了之前的瓶颈,让Hadoop机器可以扩展到比4000个节点海大。
这种体系结构还允许同时执行各种编程模型,如图形处理、迭代处理、机器学习和一般的集群计算(包括传统的MapReduce)。

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和ApplicationManager

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.classorg.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

相关推荐