前置篇:
为从根本上解决旧 MapReduce 框架的性能瓶颈,促进 Hadoop 框架的更长远发展,从 0.23.0 版本开始,Hadoop 的 计算框架完全重构,发生了根本的变化。新的 Hadoop MapReduce 框架命名为 Yarn,重构根本的思想是将 JobTracker 两个主要的功能分离成单独的组件,这两个功能是计算资源管理和任务调度 / 监控。ResourceManager
全局管理所有应用程序计算资源的分配,每一个应用的 ApplicationMaster 负责相应的调度和协调, 结合从 ResourceManager 获得的资源和 NodeManager 协同工作来运行和监控任务。
以下是对每个部件职责的更详细解释。
ResourceManager:基于应用程序对资源的需求进行调度 ,每一个应用程序需要不同类型的资源因此就需要不同的容器。资源包括:内存,CPU,磁盘,网络等等。资源管理器提供一个调度策略的插件,它负责将集群资源分配给多个队列和应用程序。调度插件可以基于现有的能力调度和公平调度模型。
NodeManager:是每一台机器框架的代理,是执行应用程序的容器,监控应用程序的资源使用情况 (CPU,内存,硬盘,网络 ) 并且向调度器汇报。
ApplicationMaster:向调度器索要适当的资源容器,运行任务,跟踪应用程序的状态和监控它们的进程,处理任务的失败原因。用户每提交一个应用程序都会为之创建一个ApplicationMaster。ApplicationMaster取决于用户提交的应用程序的数量。首先应用程序会提交给ResourceManager,然后ResourceManager为这个应用程序创建了一个ApplicationMaster。后面的资源分配以及任务执行都是围绕ApplicationMaster进行的。
正文篇:
接下来就一起研究一下包括FIFO调度器、Capacity调度器、Fair调度器在内的三个调度器。
一、FIFO调度器(先进先出调度)
上图为FIFO调度器的执行过程示意图。
FIFO Scheduler是最简单也是最容易理解的调度器,它缺点是不适用于共享集群。大的应用可能会占用所有集群资源,这就导致其它应用被阻塞。在共享集群中,更适合采用Capacity Scheduler或Fair Scheduler,这两个调度器都允许大任务和小任务在提交的同时获得一定的系统资源。从执行过程图中可以看出,在FIFO 调度器中,小任务会被大任务阻塞。
二、Capacity调度器(容量预先分配调度)
上图为Capacity调度器的执行过程示意图。
而对于Capacity调度器,有一个专门的队列用来运行小任务,但是为小任务专门设置一个队列会预先占用一定的集群资源,这就导致大任务的执行时间会落后于使用FIFO调度器时的时间。
三、Fair调度器(公平分配调度)
上图为Fair调度器的执行过程示意图。
在Fair调度器中,我们不需要预先占用一定的系统资源,Fair调度器会为所有运行的job动态的调整系统资源。如下图所示,当第一个大job提交时,只有这一个job在运行,此时它获得了所有集群资源;当第二个小任务提交后,Fair调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。
需要注意的是,在Fair调度器图中,从第二个任务提交到获得资源会有一定的延迟,因为它需要等待第一个任务释放占用的Container。小任务执行完成之后也会释放自己占用的资源,大任务又获得了全部的系统资源。最终的效果就是Fair调度器即得到了高的资源利用率又能保证小任务及时完成。
原文地址:https://blog.51cto.com/13665344/2413647