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