hadoop之 Yarn 调度器Scheduler详解

概述

集群资源是很是有限的,在多用户、多任务环境下,须要有一个协调者,来保证在有限资源或业务约束下有序调度任务,YARN资源调度器就是这个协调者。算法

YARN调度器有多种实现,自带的调度器为Capacity Scheduler和Fair Scheduler。YARN资源调度器均实现Resource Scheduler接口,是一个插拔式组件,用户能够经过配置参数来使用不一样的调度器,也能够本身按照接口规范编写新的资源调度器。默认状况下,YARN采用的是Capacity Scheduler调度器。安全

Capacity Scheduler

Capacity Scheduler简介

Capacity Scheduler(计算能力调度器)是由Yahoo贡献的,主要是解决HADOOP-3421中提出的,在调度器上完成HOD(Hadoop On Demand)功能,克服已有HOD的性能低效的缺点。它适合于多用户共享集群的环境的调度器。在多用户的状况下,达到最大化集群的吞吐和利用率的目的。markdown

Capacity 调度器容许多个组织共享整个集群,每一个组织能够得到集群的一部分计算能力。经过为每一个组织分配专门的队列,而后再为每一个队列分配必定的集群资源,这样整个集群就能够经过设置多个队列的方式给多个组织提供服务了。除此以外,队列内部又能够垂直划分,这样一个组织内部的多个成员就能够共享这个队列资源了,在一个队列内部,资源的调度是采用的是先进先出(FIFO)策略。oop

一个job可能使用不了整个队列的资源。然而若是这个队列中运行多个job,若是这个队列的资源够用,那么就分配给这些job,若是这个队列的资源不够用了呢?其实Capacity调度器仍可能分配额外的资源给这个队列,这就是弹性队列(queue elasticity)的概念。post

在正常的操做中,Capacity调度器不会强制释放Container,当一个队列资源不够用时,这个队列只能得到其它队列释放后的Container资源。固然,咱们能够为队列设置一个最大资源使用量,以避免这个队列过多的占用空闲资源,致使其它队列没法使用这些空闲资源,这就是弹性队列须要权衡的地方。性能

capacitySheduler

Capacity Scheduler特色

  • 容量保证:每一个队列都分配了一部分容量,他们能够支配着部分资源。提交到特定队列的应用程序,可使用该队列的资源。管理员能够配置每一个队列容量的最低保证和资源使用上限。
  • 安全性:每一个队列都有严格的ACL(控制访问列表),它能够控制用户提交应用程序到特定队列上。同时保证用户不能查看或修改其它用户提交的应用程序,而且队列管理员和集群系统管理员能够对其进行维护。
  • 灵活性:队列的空闲资源能够分配各其它队列使用。若是某队列的资源分配未达到队列资源使用上限,在其须要更多资源时,将分配其它队列的空闲资源给该繁忙队列。
  • 多用户性:支持多用户共享集群,一些列的综合设置能够防止单个应用程序、用户或队列独占队里或集群的所有资源。
  • 可操做性:支持运行时配置和队列中止。队列的属性(例如:资源容量分配、ACL等)能够在运行时由管理员以一种安全的方式更改,从而减小了对用户的影响。同时提供给管理员和用户一个界面,用于查看当前队列资源的使用状况。管理员能够在集群运行时添加新队列,能够在中止运行的队列的同时保证队列上的任务运行完成,而新的任务不能提交到该队列上。注意如今不支持在运行时删除队列,若是须要删除队列,须要重启集群。
  • 层级队列:层级队列可确保资源在该组织的子队列之间被共享,从而提供更多的可控制性和预测性。
  • 基于资源的调度:支持资源密集型的应用程序,容许应用程序使用的资源量高于默认值,从而该调度器能够支持不一样资源需求的应用程序。目前只支持内存资源的配置,经过配置可支持CPU资源。

Fair Scheduler

Fair Scheduler是由Facebook贡献的,是Hadoop上一个可插拔式的调度器,容许YARN应用程序在一个大的集群上公平地共享资源。3d

公平调度是一种为应用程序分配资源的方法,多用户的状况下,强调用户公平地使用资源。默认状况下Fair Scheduler根据内存资源对应用程序进行公平调度,经过配置能够修改成根据内存和CPU两种资源进行调度。当集群中只有一个应用程序运行时,那么此应用程序占用这个集群资源。当其余的应用程序提交后,那些释放的资源将会被分配给新的应用程序,因此每一个应用程序最终都能获取几乎同样多的资源。blog

在Fair Scheduler中,不须要预先占用必定的系统资源,Fair Scheduler会动态调整应用程序的资源分配。例如,当第一个大job提交时,只有这一个job在运行,此时它得到了全部集群资源;当第二个小任务提交后,Fair调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。排序

须要注意的是,在下图Fair Scheduler中,从第二个任务提交到得到资源会有必定的延迟,由于它须要等待第一个任务释放占用的Container。小任务执行完成以后也会释放本身占用的资源,大任务又得到了所有的系统资源。接口

FairScheduler

Fair Scheduler将应用程序支持以队列的方式组织,这些队列之间公平的共享资源。默认,全部的用户共享一个队列。若是应用程序在请求资源时指定了队列,那么请求将会被提交到指定的队列中。也能够经过配置,根据用户名称来分配队列。在每一个队列内部,应用程序基于内存公平共享或FIFO共享资源。

举个例子,假设有两个用户A和B,他们分别拥有一个队列。当A启动一个job而B没有任务时,A会得到所有集群资源;当B启动一个job后,A的job会继续运行,不过一下子以后两个任务会各自得到一半的集群资源。若是此时B再启动第二个job而且其它job还在运行,则它将会和B的第一个job共享B这个队列的资源,也就是B的两个job会用于四分之一的集群资源,而A的job仍然用于集群一半的资源,结果就是资源最终在两个用户之间平等的共享。过程以下图所示:

FairScheduler4Queue

Fair Scheduler容许为队列分配担最小的共享资源量,这样能够保证某些用户、groups或者应用程序总能获取充足的资源。当一个队列中有正在运行的应用程序时,它至少可以获取设置的最小资源,当队列中无任务时,它的资源将会被拆分给其余运行中的任务。

Fair Scheudler在默认状况下容许全部的任务运行,可是这也能够经过配置文件来限制每一个用户下和每一个队列下运行的任务个数。处于限制时,新提交的任务不会提交失败,而是在Scheduler queue中等待,直到先前的任务结束,再执行。

Fair Scheduler vs Capacity Scheduler

  • 相同点
    • 都支持多用户多队列,即:适用于多用户共享集群的应用环境
    • 都支持层级队列
    • 支持配置动态修改,更好的保证了集群的稳定运行。
    • 均支持资源共享,即某个队列中的资源有剩余时,可共享给其余缺资源的队列
    • 单个队列均支持优先级和FIFO调度方式
  • 不一样点
    Capacity Scheduler与Fair Scheduler最大的区别为调度策略的不一样
    • Capacity Scheduler的调度策略是,能够先选择资源利用率低的队列,而后在队列中经过FIFO或DRF进行调度。
    • Fair Scheduler的调度策略是,可使用公平排序算法选择队列,而后再队列中经过Fair(默认)、FIFO或DRF的方式进行调度。

 

转载请注明出处:http://www.cnblogs.com/BYRans/
相关文章
相关标签/搜索