2018年第24周-大数据的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.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