1 概况
Apache Hadoop YARN (Yet Another Resource Negotiator,另一种资源协调者)是Hadoop系统上的资源统一管理平台,其主要作用是实现集群资源的统一管理和调度。YARN是一个高速发展中的资源管理与调度平台,目前还不是很完善,当前只支持CPU和内存的分配。
作为资源调度器,YARN支持如下几个资源调度语义:
•获取指定节点的特定资源量;
•获取指定机架上的特定资源量;
•支持资源黑名单(添加/删除);
•要求某些应用归还指定的资源,通常用于抢占场景。
YARN目前不支持(或者说不完全支持)的调度语义有:
•获取任意节点上的特定资源量;
•获取任意机架上的特定资源量;
•获取一组或几组符合特定规则的资源量;
•细粒度资源分配,如获取主频大于2.4G的CPU等;
•动态调整资源容器容量(对长应用比较重要)。
YARN上的应用按其运行的生命周期长短,可以分为长应用和短应用,短应用通常是分析作业,作业从提交到完成,所耗的时间是有限的,作业完成后,其占用的资源就会被释放,归还给YARN进行再次分配。长应用通常是一些服务,应用启动后除非意外或人为终止,将一直运行下去:如Spark或者Storm应用。长应用通常长期占用集群上的一些资源,且运行期间对资源的需求也时常变化,因此,动态调整资源对长应用来说比较重要。目前,YARN对长应用的支持还不是很好,从社区讨论来看,受hortonworks的Hoya项目推动,YARN在2.20版本后加强了对长应用的支持。
2 应用开发
2.1 概述
YARN的应用开发主要过程如下:
YARN主要由ResourceManager和NodeManager组成,ResourceManager负责资源的管理与分配,NodeManager则负责具体资源的隔离。YARN中,资源使用container进行封装。
用户在YARN上开发应用时,需要实现如下三个模块:
•Application Client: 应用客户端用于将应用提交到YARN上,使应用运行在YARN上,同时,监控应用的运行状态,控制应用的运行;
•Application Master: AM负责整个应用的运行控制,包括向YARN注册应用、申请资源、启动容器等,应用的实际工作在容器中进行;
•Application Worker: 应用的实际工作,并不是所有的应用都需要编写worker。NodeManager启动AM发送过来的容器,容器内部封装了该应用worker运行所需的资源和启动命令。
实现上述模块,涉及如下三个RPC协议:
•ApplicationClientProtocol: Client-RM之间的协议,主要用于应用的提交;
•ApplicationMasterProtocol: AM-RM之间的协议,AM通过该协议向RM注册并申请资源;
•ContainerManagementProtocol: AM-NM之间的协议,AM通过该协议控制NM启动容器。
上述协议的定义在hadoop-yarn-api工程下。
从业务的角度看,一个应用需要分两部分进行开发,一个是接入YARN平台,实现上述3个协议,通过YARN实现对集群资源的访问和利用;另一个是业务功能的实现,这个与YARN本身没有太大关系。下面主要阐述如何将一个应用接入YARN平台。
2.2 客户端开发
客户端开发流程如图2.2所示:
从上图可以看出,客户端的主要作用是提交(部署)应用和监控应用运行两个部分。
2.2.1 提交应用
提交应用涉及ApplicationClientProtocol协议中的两个方法:
GetNewApplicationResponse getNewApplication(GetNewApplicationRequest request)
SubmitApplicationResponse submitApplication(SubmitApplicationRequest request)
具体步骤如下:
1.客户端通过getNewApplication方法从RM上获取应用ID;
2.客户端将应用相关的运行配置封装到ApplicationSubmissionContext中,通过submitApplication方法将应用提交到RM上;
3.RM根据ApplicationSubmissionContext上封装的内容启动AM;
4.客户端通过AM或RM获取应用的运行状态,并控制应用的运行过程。
通过getNewApplication可从RM上获取全局唯一的应用ID和最大可申请的资源量(内存和虚拟CPU核数),如下所示:
在获取应用程序ID后,客户端封装应用相关的配置到ApplicationSubmissionContext中,通过submitApplication方法提交到RM上。