概述
YARN是一个资源管理系统,负责集群资源的管理和调度。如果想要将一个新的应用程序运行在YARN之上,通常需要编写两个组件Client客户端和ApplicationMaster。其中,Client负责向ResourceManager提交ApplicationMaster,并查询应用程序运行状态;ApplicationMaster负责向ResourceManager申请资源(以Container形式表示),并与NodeManager通信以启动各Container,此外,ApplicationMaster还负责监控各个任务运行状态,并在失败时为其重新申请资源。通常而言,编写一个YARNAppcalition会涉及3个RPC协议,分别为:
- ApplicationClientProtocol(用于Client与ResourceManager之间):Client通过该协议可实现将应用程序提交到ResourceManager上、查询应用程序的运行状态或者杀死应用程序等功能。
- ApplicationMasterProtocol(用于ApplicationMaster与ResourceManager之间):ApplicationMaster使用该协议向ResourceManager注册、申请资源、获取各个任务运行情况等。
- ContainerManagementProtocol(用于ApplicationMaster与NodeManager之间):ApplicationMaster使用该协议要求NodeManager启动/撤销Container或者查询Container的运行状态。
Client客户端设计
Client的开发设计其主要是用于提交(部署)应用和监控应用运行两个部分;YARNApplication客户端会提供一系列访问接口供用户与YARN交互;包括提交Application、查询Application运行状态、修改Application属性(如优先级)等。其中最重要的访问接口之一是提交Application的函数。其客户端设计流程如下:
- Client通过RPC函数ApplicationClientProtocol#getNewApplication从ResourceManager中获取唯一的ApplicationID。
- Client通过RPC函数ApplicationClientProtocol#submitApplication【所有信息都封装在这个参数里】将ApplicationMaster提交到ResourceManager上。填充一定应用程序的信息:比如ApplicationMaster需要多少资源,ApplicationMaster运行jar包是什么,启动命令是什么等等。
- RM根据ApplicationSubmissionContext上封装的内容启动AM。
- 客户端通过AM或RM获取应用的运行状态,并控制应用的运行过程。
ApplicationMaster设计
ApplicationMaster(AM)需要与ResourceManager(RM)和NodeManager(NM)两个服务交互;其设计流程如下两个部分:
- 通过与ResourceManager交互,ApplicationMaster可获得任务计算所需的资源。
- 通过与NodeManager交互,ApplicationMaster可启动计算任务(container),并监控它直到运行完成。
AM与RM交互:资源申请
- ApplicationMaster通过RPC函数ApplicationMasterProtocol#registerApplicationMaster向ResourceManager注册;
- 注册的时候会告诉ResourceManager自己的ip端口;
- 注册完成后会返回一些信息:如ApplicationMaster最大资源申请量、访问token、应用程序访问控制列表等;
- ApplicationMaster通过RPC函数ApplicationMasterProtocol#allocate向ResourceManager申请资源(以Container形式表示);
- allocate是一个RPC函数,ApplicationMaster启动后,会知道内部的task数目和每个task需要申请分配的资源量,其会周期性的通过allocate向ResourceManager申请container资源;
- 在周期性的allocate资源申请过程中,其会维护与ResourceManager之间的心跳信息,告诉ResourceManager当前的ApplicationMaster处于alive状态以及其上container的运行状态;并且会从ResourceManager中获取到对应申请到的container资源以及需要被其他程序抢占资源所释放的container列表,在申请到对应的container资源后,ApplicationMaster会与NodeManageer通信来启动对应的task;
- ApplicationMaster通过RPC函数ApplicationMasterProtocol#finishApplicationMaster告诉ResourceManager应用程序执行完毕,并退出。
AM与NM交互:启动container、查询container状态、停止container
- ApplicationMaster将申请到的资源二次分配给内部的任务,并通过RPC函数ContainerManagementProtocol#startContainer与对应的NodeManager通信以启动Container(包含任务描述,资源描述等信息),该函数的参数类型为StartContainerRequest,主要包含一个类型为StartContainerRequest的字段;
- ApplicationMaster可通过RPC函数ContainerManagementProtocol#getContainerStatus向NodeManager询问Container运行状态,一旦发现某个Container运行失败,ApplicationMaster可尝试重新为对应的任务申请资源并再次启动该任务;
- 一旦一个Container运行完成后,ApplicationMaster可以通过RPC函数ContainerManagementProtocol#stopContainer释放该Container,回收该Container所占用的资源;