Capacity Scheduler调度策略当一个新的job是否允许添加到队列中进行初始化,判断当前队列和用户是否已经达到了初始化数目的上限,下面就从代码层面详细介绍整个的判断逻辑。Capaycity添加一个job,会通过注册的监听器org.apache.hadoop.mapred.JobQueuesManager向队列中添加JOB,添加JOB过程中会检查当前队列和用户是否已经达到资源上限了。

下面详细的从源码角度介绍判断的条件:

  队列的相关的上限判断条件:(queueWaitingJobs + queueInitializingJobs + queueRunningJobs) >=  maxJobsToAccept

  用户的相关上限判断条件:(userWaitingJobs + userInitializingJobs + userRunningJobs) >= maxJobsPerUserToAccept

  其中queueWaitingJobs和userWaitingJobs分别为队列和用户等待初始化的JOB数目,queueInitializingJobs和userInitializingJobs分别为队列和用户已经初始化的JOB数目,queueRunningJobs和userRunningJobs分别为队列和用户正在运行的JOB数目,waitingJobs,initializingJobs,runningJobs三个数据在CapacitySchedulerQueue中分别定义了三个MAP容器来存放和参与计数计算的。

下面着重介绍上限值maxJobsToAccept 和 maxJobsPerUserToAccept 计算方式,详细代码为:

    Int maxJobsToInit = (int)Math.ceil(maxSystemJobs * capacityPercent/100.0);
int maxJobsPerUserToInit = (int)Math.ceil(maxSystemJobs * capacityPercent/100.0 * ulMin/100.0);
int jobInitToAcceptFactor = conf.getInitToAcceptJobsFactor(queueName);
int maxJobsToAccept = maxJobsToInit * jobInitToAcceptFactor;
int maxJobsPerUserToAccept = maxJobsPerUserToInit * jobInitToAcceptFactor;

     涉及变量取值为:

     maxSystemJobs = mapred.capacity-scheduler.maximum-system-job

     capacityPercent  =  mapred.capacity-scheduler.queue.xxx.capacity

     ulMin = mapred.capacity-scheduler.queue.xxx.minimum-user-limit-percent,值为100意味着没有限制。

     jobInitToAcceptFactor = mapred.capacity-scheduler.queue.xxx.init-accept-jobs-factor,如果配置的越大,那么允许被初始化作业的量就越大。

  队列上限值maxJobsToAccept是由maxJobsToInit和jobInitToAcceptFactor的乘积得到的,maxJobsToInit是根据参数mapred.capacity-scheduler.queue.xxx.capacity来控制的,所以队列中JOB数量的上限值,直接受参数mapred.capacity-scheduler.queue.xxx.capacity和mapred.capacity-scheduler.queue.xxx.init-accept-jobs-factor影响;用户JOB数量上限值还跟参数mapred.capacity-scheduler.queue.xxx.minimum-user-limit-percent相关联,通过代码中maxJobsPerUserToInit值的计算可以直观的判断出,此参数是个百分比,值越低,那么上限值就越低。

结论:

  作业数目的上限根据所分配的队列容量mapred.capacity-scheduler.queue.xxx.capacity以及mapred.capacity-scheduler.queue.xxx.init-accept-jobs-factor来决定,在用户层面上还有一个百分比的参数mapred.capacity-scheduler.queue.xxx.minimum-user-limit-percent来影响上限数目的计算。

欢迎加入Hadoop技术群进行交流:147681830

Hadoop学习之--Capaycity Scheduler源码分析的更多相关文章

  1. Hadoop学习笔记(10) ——搭建源码学习环境

    Hadoop学习笔记(10) ——搭建源码学习环境 上一章中,我们对整个hadoop的目录及源码目录有了一个初步的了解,接下来计划深入学习一下这头神象作品了.但是看代码用什么,难不成gedit?,单步 ...

  2. memcached学习笔记——存储命令源码分析下篇

    上一篇回顾:<memcached学习笔记——存储命令源码分析上篇>通过分析memcached的存储命令源码的过程,了解了memcached如何解析文本命令和mencached的内存管理机制 ...

  3. memcached学习笔记——存储命令源码分析上篇

    原创文章,转载请标明,谢谢. 上一篇分析过memcached的连接模型,了解memcached是如何高效处理客户端连接,这一篇分析memcached源码中的process_update_command ...

  4. scheduler源码分析——preempt抢占

    前言 之前探讨scheduler的调度流程时,提及过preempt抢占机制,它发生在预选调度失败的时候,当时由于篇幅限制就没有展开细说. 回顾一下抢占流程的主要逻辑在DefaultPreemption ...

  5. Redis学习之底层链表源码分析

    Redis底层链表的源码分析: 一.链表结点的结构(单个结点): // listNode 双端链表节点 typedef struct listNode { // 前置节点 struct listNod ...

  6. scheduler源码分析——调度流程

    前言 当api-server处理完一个pod的创建请求后,此时可以通过kubectl把pod get出来,但是pod的状态是Pending.在这个Pod能运行在节点上之前,它还需要经过schedule ...

  7. tornado 学习笔记6 Application 源码分析

    Application 是Tornado重要的模块之一,主要是配置访问路由表及其他应用参数的设置. 源代码位于虚拟运行环境文件夹下(我的是env),具体位置为env > lib>sit-p ...

  8. EasyUI学习总结(三)——easyloader源码分析(转载)

    声明:这一篇文章是转载过来的,转载地址忘记了,原作者如果看到了,希望能够告知一声,我好加上去! easyloader模块是用来加载jquery easyui的js和css文件的,而且它可以分析模块的依 ...

  9. 正式学习React(五) react-redux源码分析

    磨刀不误砍柴工,咱先把react-redux里的工具函数分析一下: 源码点这里  shallowEqual.js export default function shallowEqual(objA, ...

随机推荐

  1. MVC5中Model层开发数据注解

    ASP.NET MVC5中Model层开发,使用的数据注解有三个作用: 数据映射(把Model层的类用EntityFramework映射成对应的表) 数据验证(在服务器端和客户端验证数据的有效性) 数 ...

  2. 机器学习 —— 概率图模型(学习:CRF与MRF)

    在概率图模型中,有一类很重要的模型称为条件随机场.这种模型广泛的应用于标签—样本(特征)对应问题.与MRF不同,CRF计算的是“条件概率”.故其表达式与MRF在分母上是不一样的. 如图所示,CRF只对 ...

  3. ubuntu13.04下载android4.0.1源码过程

    最初我参考的是老罗的博客http://blog.csdn.net/luoshengyang/article/details/6559955 进行下载安装的,但弄着弄着就发现不太对劲了.这里记录下详细过 ...

  4. objectC时间用法

    #define kDEFAULT_DATE_TIME_FORMAT (@"yyyy-MM-dd HH:mm:ss") //获取当前日期,时间+(NSDate *)getCurren ...

  5. GetKeyState和GetAsyncKeyState以及GetKeyboardState函数的用法与区别2-------C#检查键盘大小写锁定状态

    1.命名空间:using System.Runtime.InteropServices;2.导入方法[DllImport("user32.dll", EntryPoint = &q ...

  6. WIN7建立网络映射磁盘

    建立网络映射磁盘 如果需要经常访问网络中的同一个共享文件夹,则可以将这个共享文件夹直接映射为本地计算机中的一个虚拟驱动器.其具体操作如下. (1)双击桌面上"计算机"图标,打开&q ...

  7. 【POJ】2170 Lattice Animals

    1. 题目描述给定$n \times m, n.m \in [1, 10]$的方格,求不同形状的$[1 \cdots 10]$联通块的个数?所谓不同形状,表示不能通过平移.旋转.镜像实现相同的形状.2 ...

  8. HDU4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)

    Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  9. [swustoj 785] Divide Tree

    Divide Tree(0785) 问题描述 As we all know that we can consider a tree as a graph. Now give you a tree wi ...

  10. ios 编译openssl支持arm64(转)

    最近在编译支付宝 快捷支付(无线) ios 端的时候发现demo不支持arm64.在网上找了下,看到客服说是openssl的库文件不支持arm64,于是自己编译了支持arm64的库文件,发现还是不行, ...