1.客户端将任务提交给resourceManager
2.resourceManager接受任务请求
3.resourceManager在nodeManager上寻找一个比较空闲的节点,
通知启动一个appMaster,将任务信息发送给appMaster
等待appMaster启动成功
如果启动失败,认为当前任务直接报错,告知任务无法执行
当对应节点启动成功后 报告给主节点(resourceManager)已经启动成功
4.appMaster启动后,开始和主节点保持着心跳机制,
appMaster获知任务的相关信息(jar包路径、主类、参数)
5.appMaster开始根据任务信息,计算共需要多少mapTask和多少个reduceTask
6.appMaster通过心跳包,将任务计算的结果资源需求发送给主节点,进行资源的申请
7.主节点根据接收到的资源申请的结果信息,进行资源的分配工作
如果资源非常宽裕,一次性将所需的所有资源一并全返回
如果资源比较紧张,最起码应该返回所有mapTask所需资源
8.appMaster通过心跳包,一直向主节点询问,是否已经准备好资源,
一旦准备好,将资源信息全部获取
9.appMaster根据获取的资源信息,通知各个nodeManager,启动相关的程序
(先启动mapTask),同时告知nodeManager任务信息(jar包 主类 参数信息)
10.每一个运行的container定时和appMaster汇总执行任务的进度
并且还基于nodeManager 和resourceManager的使用情况,报告资源使用的情况
如果初始化的时候 只是返回mapTask运行的资源,当mapTask执行完成后或者执行过程中 appMaster向resourceManagerTask询问reduceTask的资源是否已经准备好了 如果准备好就进行reduce任务
11.当整个mapTask和reduceTask都运行完成后,container通知appMaster已经执行完成后,报告给resourceManager已经完成任务
12.resourceManager收回所有分配的资源,然后通知appMaster可以执行自毁程序 释放内存
通俗理解:
主节点ResourceManager相当于一个老板 appMaster相当于一个经理 container相当于员工
首先客户把需求给老板 老板找一个经理分配任务
经理要不断与老板保持联系 ,从老板那里获得任务相关信息
经理计算需要用到的map和reduce资源 向老板要资源
老板将资源给到经理 经理开始通知nodeManager干活
container小弟要与经理不断保持联系汇报map任务和reduce任务的进展 和主节点、nodeManager 资源使用情况
当map、reduce任务都完成后 小弟给经理汇报 经理给老板汇报
然后老板收到消息 收回资源 释放内存
YARN是一个资源管理、任务调度的框架,主要包含三大模块:ResourceManager(RM)、NodeManager(NM)、ApplicationMaster(AM)。
ResourceManager负责所有资源的监控、分配和管理;
ApplicationMaster负责每一个具体应用程序的调度和协调;
NodeManager负责每一个节点的维护
三大组件介绍
ResourceManager
- ResourceManager负责整个集群的资源管理和分配,是一个全局的资源管理系统。
- NodeManager以心跳的方式向ResourceManager汇报资源使用情况(目前主要是CPU和内存的使用情况)。RM只接受NM的资源回报信息,对于具体的资源处理则交给NM自己处理。
- YARN Scheduler根据application的请求为其分配资源,不负责application job的监控、追踪、运行状态反馈、启动等工作。
NodeManager
- NodeManager是每个节点上的资源和任务管理器,它是管理这台机器的代理,负责该节点程序的运行,以及该节点资源的管理和监控。YARN集群每个节点都运行一个NodeManager。
- NodeManager定时向ResourceManager汇报本节点资源(CPU、内存)的使用情况和Container的运行状态。当ResourceManager宕机时NodeManager自动连接RM备用节点。
- NodeManager接收并处理来自ApplicationMaster的Container启动、停止等各种请求
ApplicationMaster
- 用户提交的每个应用程序均包含一个ApplicationMaster,它可以运行在ResourceManager以外的机器上。
- 负责与RM调度器协商以获取资源(用Container表示)。
- 将得到的任务进一步分配给内部的任务(资源的二次分配)。
- 与NM通信以启动/停止任务。
- 监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。
- 当前YARN自带了两个ApplicationMaster实现,一个是用于演示AM编写方法的实例程序DistributedShell,它可以申请一定数目的Container以并行运行一个Shell命令或者Shell脚本;另一个是运行MapReduce应用程序的AM—MRAppMaster。
注:RM只负责监控AM,并在AM运行失败时候启动它。RM不负责AM内部任务的容错,任务的容错由AM完成。