hadoop 容量能力调度器

计算能力/容量调度器(Capacity Scheduler)是Yahoo公司开发的多用户调度器。多用户调度器的使用场景很多,根据资料1的说法,Hadoop集群的用户量越来越大,不同用户提交的应用程序具有不同的服务质量要求(QoS):

1. 批处理作业:耗时较长,对完成时间没有严格要求。如数据挖掘、机器学习等应用。

2. 交互式作业:期望及时返回结果。如Hive等应用。

3. 生产性作业:要求一定量的的资源保证。如统计值计算、垃圾数据分析等。

传统的FIFO调度器不能满足应用对响应时间和资源的多样化要求,多用户多队列调度器应运而生。容量调度器即是其中被广泛应用的一种。


一、基本思想

容量调度器以队列为单位划分资源,每个队列都有资源使用的下限和上限。每个用户也可以设定资源使用上限。一个队列的剩余资源可以共享给另一个队列,其他队列使用后还可以归还。管理员可以约束单个队列、用户或作业的资源使用。支持资源密集型作业,可以给某些作业分配多个slot(这是比较特殊的一点)。支持作业优先级,但不支持资源抢占。

这里明确一下用户、队列和作业之间的关系。Hadoop以队列为单位管理资源,每个队列分配到一定的资源,用户只能向一个或几个队列提交作业。队列管理体现为两方面:1. 用户权限管理:Hadoop用户管理模块建立在操作系统用户和用户组之间的映射之上,允许一个操作系统用户或者用户组对应一个或者多个队列。同时可以配置每个队列的管理员用户。队列信息配置在mapred-site.xml文件中,包括队列的名称,是否启用权限管理功能等信息,且不支持动态加载。队列权限选项配置在mapred-queue-acls.xml文件中,可以配置某个用户或用户组在某个队列中的某种权限。权限包括作业提交权限和作业管理权限。2. 系统资源管理:管理员可以配置每个队列和每个用户的可用资源量信息,为调度器提供调度依据。这些信息配置在调度器自己的配置文件(如Capacity-Scheduler.xml)中。

3. 计算能力调度器算法分析
3.1 涉及到的变量
在capacity中,存在三种粒度的对象,分别为:queue、job和task,它们均需要维护的一些信息:
(1) queue维护的信息
@ queueName:queue的名称
@ ulMin:每个用户的可用的最少资源量(所有用户均相同),需用户在配置文件中指定
@ capacityPercent:计算资源比例,需用户在配置文件中指定
@ numJobsByUser:每个用户的作业量,用以跟踪每个用户提交的作业量,并进行数量的上限限制。
该队列中map 或reduce task的属性:
@ capacity:实际的计算资源量,这个随着tasktracker中slot数目变化(用户可能在添加或减少机器节点)而动态变化,大小为:capacityPercent*mapClusterCapacity/100
@ numRunningTasks:正在running的task数目
@ numSlotsOccupied:正在running的task占用的slot总数,注意,在Capacity Scheduler中,running task与slot不一定是一一对应的,每个task可获取多个slot,这主要是因为该调度支持内存资源调度,某个task可能需要多个slot包含的内存量。
@ numSlotsOccupiedByUser:每个用户的作业占用slot总数,用以限制用户使用的资源量。
(2) job维护的信息
priority:作业优先级,分为五个等级,从大到小依次为:VERY_HIGH,HIGH,NORMAL,LOW,VERY_LOW;
numMapTasks/ numReduceTasks :job的map/reduce task总数
runningMapTasks/ runningMapTasks:job正在运行的map/reduce task数
finishedMapTasks/finishedReduceTasks:job已完成的map/reduce task数
……
(3) task维护的信息
task开始运行时间,当前状态等
3.2 计算能力调度算法
当某个tasktracker上出现空闲slot时,调度器依次选择一个queue、(选中的queue中的)job、(选中的job中的)task,并将该slot分配给该task。下面介绍选择queue、job和task所采用的策略:
(1) 选择queue:将所有queue按照资源使用率(numSlotsOccupied/capacity)由小到大排序,依次进行处理,直到找到一个合适的job。
(2) 选择job:在当前queue中,所有作业按照作业提交时间和作业优先级进行排序(假设开启支持优先级调度功能,默认不支持,需要在配置文件中开启),调度依次考虑每个作业,选择符合两个条件的job:[1] 作业所在的用户未达到资源使用上限 [2] 该TaskTracker所在的节点剩余的内存足够该job的task使用。
(3) 选择task,同大部分调度器一样,考虑task的locality和资源使用情况。(即:调用JobInProgress中的obtainNewMapTask()/obtainNewReduceTask()方法)
综合上述,公平调度器的伪代码为:

// CapacityTaskScheduler:trackTracker出现空闲slot,为slot寻找合适的task
 
List<Task> assignTasks(TaskTrackerStatus taskTracker) {
 
  sortQueuesByResourcesUsesage(queues);
 
  for queue:queues {
 
    sortJobsByTimeAndPriority(queue);
 
    for job:queue.getJobs() {
 
      if(matchesMemoryRequirements(job,taskTracker)) {
 
        task = job. obtainNewTask();
 
        if(task != null) return task
 
      }
 
    }
 
  }
 
}


4. 计算能力调度器源代码分析
计算能力调度器位于代码包的hadoop-0.20.2\src\contrib\capacity-scheduler目录下。
4.1 源代码包组成(共5个java文件)
CapacitySchedulerConf.java:管理配置文件
CapacityTaskScheduler.java:调度器的核心代码
JobQueuesManager.java:管理作业队列
MemoryMatcher.java:用于判断job与内存容量是否匹配
JobInitializationPoller.java:作业初始化类,用户可同时启动多个线程,加快作业初始化速度。
4.2 CapacityTaskScheduler分析
只介绍调度器最核心的代码,即CapacityTaskScheduler.java文件中的代码。
(1) 几个基本的内类:
[1] TaskSchedulingInfo(TSI):用以维护某种task(MAP或者REDUCE)的调度信息,包括numRunningTasks,numSlotsOccupied等
[2] QueueSchedulingInfo(QSI):用以跟踪某个queue中的调度信息,包括capacityPercent,ulMin等
[3] TaskSchedulingMgr:调度的核心实现算法,这是一个抽象类,有两个派生类,分别为:MapSchedulingMgr和ReduceSchedulingMgr,用以实现map task和reduce task的调度策略
(2) 核心方法(按照执行顺序分析):
[1] CapacityTaskScheduler.start(): 调度器初始化,包括加载配置文件,初始化各种对象和变量等。
[2] CapacityTaskScheduler. assignTasks ():当有一个TaskTracker的HeartBeat到达JobTracker时,如果有空闲的slot,JobTracker会调用Capacity Scheduler中的assignTasks方法,该方法会为该TaskTracker需找若干个合适的task。在assignTasks方法中,会调用TaskSchedulingMgr中的方法。
前面提到TaskSchedulingMgr是一个抽象类,它实现了所有派生类必须使用的方法:
[3] TaskSchedulingMgr.assignTasks (taskTracker):对外提供的最直接的调用函数,主要作用是为taskTracker选择一个合适的task,该函数会依次扫描系统中所有的queue(queue已经被排好序,排序类为TaskSchedulingMgr.QueueComparator),对于每个queue,调用getTaskFromQueue(taskTracker, qsi)。
[4] TaskSchedulingMgr.getTaskFromQueue(taskTracker, qsi):从队列qsi中选择一个符合条件的作业,这里的“条件”包括用户的资源量上限,taskTracker空闲内存等。
5. 计算能力调度器与公平调度器对比
(1) 相同点
@ 均支持多用户多队列,即:适用于多用户共享集群的应用环境
@ 单个队列均支持优先级和FIFO调度方式
@ 均支持资源共享,即某个queue中的资源有剩余时,可共享给其他缺资源的queue
(2) 不同点
@ 核心调度策略不同。 计算能力调度器的调度策略是,先选择资源利用率低的queue,然后在queue中同时考虑FIFO和memory constraint因素;而公平调度器仅考虑公平,而公平是通过作业缺额体现的,调度器每次选择缺额最大的job(queue的资源量,job优先级等仅用于计算作业缺额)。
@ 内存约束。计算能力调度器调度job时会考虑作业的内存限制,为了满足某些特殊job的特殊内存需求,可能会为该job分配多个slot;而公平调度器对这种特殊的job无能为力,只能杀掉这种task。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值