初印象
YARN是一个通用的资源管理模块,可为各类应用程序进行资源管理和调度。在YARN上不仅可以运行MapReduce程序,还可以运行Spark、FLink等各种计算框架。YARN总体上采用的是Master/Slave架构,它包括ResourceManager和NodeManager,ResourceManager负责对各个NodeManager上的资源进行管理和调度。
-
ResourceManager(RM)
RM是一个全局的资源管理器,负责整个系统的资源管理和分配。它主要由调度器(Scheduler)和应用程序管理器(Applications Manager)组成。调度器根据容量、队列等限制条件,将系统中的资源分配给各个正在运行的作业。YARN提供了多种不同的调度器。包括Fair Scheduler(公平调度)、FIFO Scheduler(先进先出调度)、Capacity Scheduler(容量调度)。应用程序管理器负责管理整个系统中的所有应用程序,包括应用程序的提交、与调度器协商资源以启动ApplicationMaster、监控ApplicationMaster的运行状态以及在失败时重启它。
2、ApplicationMaster(AM)
用户提交的每个应用程序都包含一个AM。它的主要功能包括。
(1)、与RM调度器协商以获得资源。
(2)、与NM通信以启动/停止任务。
(3)、将得到的任务进一步分配给内部的任务。
(4)、监控任务的运行状态。
3、NodeManager(NM)
NM是每个节点上的资源和任务的管理器,一方面,它会定时的向RM汇报本节点上的资源使用情况和各个Container的运行状态。另一方面,它接收并处理来自AM的Container启动/停止等请求。
4、Container
Container是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、 CPU、磁盘、网络等,当 AM 向 RM 申请资源时,RM 为 AM 返回的资源便是用Container表示的。
YARN工作流程
当用户向YARN中提交应用程序时,YARN将分两个阶段运行该应用程序。第一个阶段是启动ApplicationMaster;第二个阶段由ApplicationMaster创建应用程序,为它申请资源并监控它的整个运行过程,直到完成。
下面我们来看一下
一个任务从提交到执行再到完成的整个过程
。
1.用户向ResouceManager中提交应用程序。
2.ResourceManager为该应用程序分配第一个Container,并与对应的NodeManager进行通信,要求在这个Container中启动应用程序的ApplicationMaster.
3.ApplicationMaster启动后,向ResourceManager进行注册。然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复4-7步。
4.ApplicationMaster采用RPC协议向ResourceManger申请和领取资源。
5.一旦ApplicationMaster申请到资源后,便与对应的NodeManager进行通信,要求它启动任务。
6.NodeManger启动相应的任务。
7.各个任务通过RPC的方式向ApplicationMaster汇报自己的状态和进度,可以让ApplicationMaster掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。
8.应用程序执行完成后,ApplicationMaster先ResourceManager注销并关闭自己。
资源调度模型
YARN采用的是
双层资源调度模型
。在第一层中,ResourceManager中的资源调度器将资源分配给各个ApplicationMaster;在第二层中,ApplicationMaster再进一步将资源分配给它内部的任务。我们这里主要说一下
第一层的调度问题
。第二层的调度策略,完全由用户应用程序自己决定。
在YARN中,资源分配过程可以概况为以下7步。
-
NodeManager通过心跳周期性的汇报节点信息。
-
ResourceManager为NodeManager返回一个心跳应答,包括释放Container列表等信息。
-
ResourceManager收到来自NodeManager的信息后,会触发一个Node_Update事件。
-
ResourceScheduler收到Node_Update事件后,会按照一定的策略将该节点上的资源(步骤2中有释放资源)分配给应用程序,并将分配结果放到一个内存数据结构中。
-
应用程序ApplicationMaster周期性的向ResourceManager发送心跳,以领取最新分配的Container。
-
ResourceManger收到来自ApplicationMaster的心跳信息后,为它分配的Container通过心跳应答的形式返回给ApplicationMaster。
-
ApplicationMaster收到新分配的Container列表后,会将这些Container进一步分配给它内部的各个任务。
资源调度器关注的是步骤4中采取的策略,即如何将节点上的空闲资源分配给各个应用程序。
调度器
FIFO Scheduler把应用按提交的顺序排成一个队列,这是一个 先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。
FIFO Scheduler是最简单也是最容易理解的调度器,也不需要任何配置,但它并不适用于共享集群。大的应用可能会占用所有集群资源,这就导致其它应用被阻塞。在共享集群中,更适合采用Capacity Scheduler或Fair Scheduler,这两个调度器都允许大任务和小任务在提交的同时获得一定的系统资源。
从图中可以看出,在FIFO 调度器中,小任务会被大任务阻塞。
而对于Capacity调度器,有一个专门的队列用来运行小任务,但是为小任务专门设置一个队列会预先占用一定的集群资源,这就导致大任务的执行时间会落后于使用FIFO调度器时的时间。
在Fair调度器中,我们不需要预先占用一定的系统资源,Fair调度器会为所有运行的job动态的调整系统资源。如图所示,当第一个大job提交时,只有这一个job在运行,此时它获得了所有集群资源;当第二个小任务提交后,Fair调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。
需要注意的是,在图Fair调度器中,从第二个任务提交到获得资源会有一定的延迟,因为它需要等待第一个任务释放占用的Container。小任务执行完成之后也会释放自己占用的资源,大任务又获得了全部的系统资源。最终的效果就是Fair调度器即得到了高的资源利用率又能保证小任务及时完成。
参考链接:
https://blog.csdn.net/weixin_39182877/article/details/79099225