

ResourceManager(RM):Yarn的Master节点,负责对整个集群资源进行统一的管理与调度,核心组件有调度器与应用管理器;
NodeManager(NM):Yarn的Slave节点,在集群的每个节点上都部署,定期向ResourceManager汇报本节点资源使用情况、启停容器;
Container:Yarn的资源抽象,代表节点的部分资源,目前支持CPU、内存。一个Container同时绑定这一个进程,通常说启停Container就是指启停其代表的进程;
Client:Yarn客户端,可提交yarn应用,spark的spark-submit就是spark的客户端;
ApplicationMaster(AM):每个Yarn应用都包含一个特定的AM,是一个应用第一个启动的Container。其主要功能有:向RM申请资源、与NM通信启停Container、监控计算任务状态,失败时进行容错处理;
Yarn应用开发要做哪些工作。
要写两大组件:Client和AM。Client负责RM申请资源,提交AM,并可持续查询跟踪AM的运行状态。Client的具体运行流程如下:

客户端调用RPC函数ApplicationClientProtocal#getNewApplication,申请应用运行唯一的application ID;
客户端将AM启动必要的资源文件,如jar包、配置文件等上传HDFS;
构造ApplicationSubmissionContext对象,里面包含了AppId, AppType, AppName等信息,以及启动AM需要的ContainerLauchContext, 其包含启动AM需要的环境变量、资源文件地址,启动命令等;
客户端调用ApplicationClientProtocal#submitApplication将ApplicationSubmissionContext提交给RM;
直此客户端的主要任务已经完成。不过一个功能完备的客户端,不仅需要与RM交互,还需要与AM交互以查询应用程序内部的信息,甚至控制应用程序的执行。这一部分同样需要由应用程序自己设计实现。

AM向RM进行注册,注册完成后,应用的状态会从ACCEPT变成RUNNING。如果AM一直不进行注册,默认10分钟后RM会杀死该AM; AM通过RPC函数ApplicationMAsterProtocol#allocate向RM申请资源,即使AM不再需要申请资源也需要周期性调用该函数,以保持与RM之间的心跳; AM申请到资源后,进行再次分配给内部的任务,通过直接与NM通信启动Container; 一旦整个应用完成,AM通过RPC函数ApplicationMasterProtocol# finishApplication告诉RM应用程序执行完毕,并退出;

Yarn的编程比较复杂,尤其应用自身任务的容错都靠自己实现,所有必须亲自动手实践才能真正掌握Yarn编程。本人github上有yarn应用的项目Thallo:https://github.com/loveoobaby/Thallo,有兴趣的同学可以参阅。




