度器根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。调度器仅根据各个应用程序的资源需求进行资源分配,而资源分配单位用一个抽象概念“资源容器”(Resource Container,简称Container)表示,Container是一个动态资源分配单位,它将内存、CPU、磁盘、网络等资源封装在一起,从而限定每个任务使用的资源量。此外,Scheduler是一个可插拔的组件,用户可根据自己的需要设计新的调度器,YARN提供了多种直接可用的调度器,比如Fair Scheduler和Capacity Scheduler等。
2.1.1 Scheduler
Scheduler是一个可插拔的插件,负责各个运行中的应用的资源分配,受到资源容量,队列以及其他因素的影响。是一个纯粹的调度器,不负责应用程序的监控和状态追踪,不保证应用程序的失败或者硬件失败的情况对 TASK 重启,而是基于应用程序的资源需求执行其调度功能,使用了叫做资源 container 的概念,其中包括多种资源,比如,cpu,内存,磁盘,网络等。在 Hadoop 的 MapReduce 框架中主要有三种Scheduler:FIFO Scheduler,Capacity Scheduler 和 Fair Scheduler。
FIFO Scheduler:先进先出,不考虑作业优先级和范围,适合低负载集群。
Capacity Scheduler:将资源分为多个队列,允许共享集群,有保证每个队列最小资源的使用。
Fair Scheduler:公平的将资源分给应用的方式,使得所有应用在平均情况下随着时间得到相同的资源份额。
2.1.2 ApplicationManager
ApplicationManager 主要负责接收 job 的提交请求,为应用分配第一个Container 来运行 ApplicationMaster,还有就是负责监控 ApplicationMaster,在遇到失败时重启 ApplicationMaster 运行的 Container。
2.2 ApplicationMaster(AM)
ApplicationMaster(AM):用户提交的每个应用程序均包含一个AM,主要功能包括:
与ResourceManager调度器协商以获取资源(用Container表示);
将得到的任务进一步分配给内部的任务(资源的二次分配);
与NM通信以启动/停止任务;
监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。
当一个 ApplicationMaster 启动后,会周期性的向 ResourceManager 发送心跳报告来确认其健康和所需的资源情况,在建好的需求模型中,ApplicationMaster 在发往 ResourceManager 中的心跳信息中封装偏好和限制,在随后的心跳中, ApplicationMaster 会对收到集群中特定节点上绑定了一定的资源的 Container 的租约,根据 ResourceManager 发来的 Container,ApplicationMaster 可以更新它的执行计划以适应资源不足或者过剩,Container 可以动态的分配和释放资源。