Hadoop学习之--Capaycity Scheduler源码分析

来源:互联网 发布:英菲克网络机顶盒老卡 编辑:程序博客网 时间:2024/05/22 12:53

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


原创粉丝点击