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. Linux之vi/vim命令

    vi命令是linux中必不可少的一个编辑器工具.那么vi与vim又有什么区别呢,可以简单理解为vim是vi的升级版.在编辑一个文本时,vi不会显示颜色,而vim会显示颜色.显示颜色更易于用户进行编辑, ...

  2. Spring 操作数据库

    试了一下spring的JdbcTemplate觉得很好用.首先增加一个连接到mysql数据库的dataSource <bean id="dataSource2" class= ...

  3. windows下python脚本程序的运行

    c:\python33\python.exe c:\python33\trycoding.py

  4. 解决Cygwin中vim的backspace不能正常使用(转)

    转载于:http://blog.chinaunix.net/uid-20614631-id-1914849.html  亲测可用 先把Cygwin下载下来,想在linux下编程的话一定要安装vim,g ...

  5. SPRING STS Virgo OSGI 开发一 : bundle 项目的创建

    1. Spring STS 下载地址  (spring 最近改了站点 暂时不是太熟悉)     http://spring.io/tools/sts/all 2. 下载 Virgo 插件    htt ...

  6. struct TABLE_SHARE

    struct TABLE_SHARE { TABLE_SHARE() {} /* Remove gcc warning */ /** Category of this table. */ TABLE_ ...

  7. UVa 10652 (简单凸包) Board Wrapping

    题意: 有n块互不重叠的矩形木板,用尽量小的凸多边形将它们包起来,并输出并输出木板总面积占凸多边形面积的百分比. 分析: 几乎是凸包和多边形面积的裸题. 注意:最后输出的百分号前面有个空格,第一次交P ...

  8. android中的ellipsize设置(省略号的问题)

    textview中有个内容过长加省略号的属性,即ellipsize,可以较偷懒地解决这个问题,哈哈~ 用法如下: 在xml中 android:ellipsize = "end"   ...

  9. json转csv

    import re # csv格式 # 'k1,k2,k3\nv1,v2,v3\nv4,v5,v6\n' market_list_data = { "data": [ { &quo ...

  10. poj 1742 Coins

    // v给出N种硬币和个数,问可以取到1->M中的多少个值.// 背包 完全背包 或多 重背包(二进制优化)都可以做// #include <iostream> #include & ...