yarn的组件和启动job的流程

来源:互联网 发布:caffe windows到linux 编辑:程序博客网 时间:2024/05/30 12:03

随着集群规模和负载的增加,JobTracker在内存消耗,线程模型,扩展性,可靠性方面暴露出了缺点,为此需要对它进行大整修。
MRv2最基本的设计思想是将JobTracker的两个主要功能,即资源管理和作业调度/监控分成两个独立的部分。在该解决方案中包含两个组件:全局的Resource Manager(RM)和与每个应用相关的Application Master(AM)。这里的“应用”指一个单独作业。RM和与NodeManager(NM,每个节点一个)共同组成整个数据计算框架。RM是系统中将资源分配给各个应用的最终决策者。AM实际上是一个具体的框架库,它的任务是“与RM协商获取应用所需资源”和“与NM合作以完成执行和监控task的任务”。
yarn的结构
yarn有两种节点,Resource Manager和Node Manager。

RM由两个组件组成,资源调度器(Resource Scheduler)和应用管理器(Applications Manager,ASM)。
RM根据容量,队列等限制条件,将系统中的资源分配给各个正在运行的应用。这里的调度器是一个“纯调度器”,因为它不再负责监控或者跟踪应用的执行状态等,此外,他也不负责重新启动因应用执行失败或者硬件故障而产生的失败任务。调度器仅根据各个应用的资源需求进行调度,这是通过抽象概念“资源容器”完成的,资源容器(Resource Container)将内存,CPU,磁盘,网络等资源封装在一起,从而限定每个任务使用的资源量。
调度器是可插拔的组件,YARN自带了多个资源调度器,如Capacity Scheduler和Fair Scheduler等。
ASM主要负责接收作业,协商获取第一个容器用于执行AM和提供重启失败AM container的服务。

NM是每个节点上的框架代理,主要负责启动应用所需的容器,监控资源(内存,CPU,磁盘,网络等)的使用情况并将之汇报给调度器。
AM主要负责同调度器协商以获取合适的容器,并跟踪这些容器的状态和监控其进度。

AM负责计算应用程序所需的资源量,比如MapReduce的input-splits,并把他们转化成调度器可以理解的协议。
调度器会尽量匹配该表中的资源;如果某个特定机器上的资源是不可用的,调度器会提供同一个机架或者不同机架上的等量资源代替之。有些情况下,由于整个集群非常忙碌,AM获取的资源可能不是最合适的,此时它可以拒绝这些资源并请求重新分配。

组件说明

NodeManager

每个节点上装有一个NM,主要的职责有:
(1)为应用程序启动容器,同时确保申请的容器使用的资源不会超过节点上的总资源。
(2)为task构建容器环境,包括二进制可执行文件,jars等。
(3)为所在的节点提供了一个管理本地存储资源的简单服务,应用程序可以继续使用本地存储资源即使它没有从RM那申请。比如:MapReduce可以使用该服务程序存储map task的中间输出结果。

调度器

调度器收集所有正在运行的应用程序的资源请求并构建一个全局规划进行资源分配。调度器会根据应用程序相关的约束(如合适的机器)和全局约束(如队列资源总量,用户可提交作业总数等)分配资源。
调度器使用与容量调度类似的概念,采用容量保证作为基本的策略在多个应用程序间分配资源。
调度器的调度策略如下:
· 选择系统中“服务最低”的队列(如何定义服务最低?可以是资源利用量最低的队列,即:已使用的资源与总共可用资源比值最小)
· 从该队列中选择优先级最高的作业
· 尽量满足该作业的资源请求

ASM

ASM负责管理系统中所有应用程序的AM,ASM负责启动AM,监控AM的运行状态,在AM失败时对其进行重启等。
为了完成该功能,ASM主要有以下几个组件:
(1) SchedulerNegotiator:与调度器协商容器资源,并返回给AM
(2) AMContainerManager:告知NM,启动或者停止某个AM的容器
(3) AMMonitor:查看AM是否活着,并在必要的时候重启AM

ApplicationMaster

每个应用程序均会有一个AM,主要职责有:
(1) 与调度器协商资源
(2) 与NM合作,在合适的容器中运行对应的task,并监控这些task执行
(3) 如果container出现故障,AM会重新向调度器申请资源
(4) 计算应用程序所需的资源量,并转化成调度器可识别的格式(协议)
(5) AM出现故障后,ASM会重启它,而由AM自己从之前保存的应用程序执行状态中恢复应用程序。

调度器API

Yarn调度器与AM之间仅有一个API:
Response allocate(List<ResourceRequest> ask, List<Container> release);
AM使用一个ResourceRequest列表请求特定资源,并同时可要求释放一些调度器已经分配的容器。
Response包含三方面内容:新分配的容器列表,自从上次AM与RM交互以来已经计算完成的容器的状态(包含该容器中运行task的详细信息),当前集群中剩余资源量。 AM收集完成容器的信息并对失败的任务作出反应。资源剩余量可用于AM调整接下来的资源请求,如MapReduce AM可使用该信息以合理调度maps和reduces从而防止产生死锁。

一个job的启动步骤

客户端

步骤1 获取ApplicationId。客户端向ResourceManager提交请求GetNewApplicationRequest,ResourceManager为其返回应答GetNewApplicationResponse,该数据结构中包含多种信息,包括ApplicationId、可资源使用上限和下限等。
步骤2 提交ApplicationMaster。客户端将启动ApplicationMaster所需的所有信息打包到数据结构ApplicationSubmissionContext中,然后调用submitApplication(ApplicationSubmissionContext)将ApplicationMaster提交到ResourceManager上。
步骤3 启动ApplicationMaster。ResourceManager收到请求后,会为ApplicationMaster寻找合适的节点,并在该节点上启动它。

ApplicationMaster

ApplicationMaster需要与ResoureManager和NodeManager交互,以申请资源和启动Container。
步骤1 注册。ApplicationMaster首先需向ResourceManager发送注册请求RegisterApplicationMasterRequest,而ResourceManager将返回RegisterApplicationMasterResponse。
步骤2 申请资源。根据每个任务的资源需求,ApplicationMaster可向ResourceManager申请一系列用于运行任务的Container,ApplicationMaster使用ResourceRequest类描述每个Container。一旦为任务构造了Container后,ApplicationMaster会向ResourceManager发送一个AllocateRequest对象,以请求分配这些Container。ResourceManager会为ApplicationMaster返回一个AllocateResponse对象。
步骤3 启动Container。当ApplicationMaster(从ResourceManager端)收到新分配的Container列表后,会向对应的NodeManager发送ContainerLaunchContext以启动Container。
ApplicationMaster会不断重复步骤2~3,直到所有任务运行成功。


参考文献


如何编写YARN应用程序
http://dongxicheng.org/mapreduce-nextgen/how-to-write-an-yarn-applicationmaster/
下一代Apache Hadoop MapReduce框架的架构
http://dongxicheng.org/mapreduce-nextgen/nextgen-mapreduce-introduction/

0 0
原创粉丝点击