天天看點

Hadoop學習之--Capaycity Scheduler源碼分析

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源碼分析

繼續閱讀