这里参考Capacity Scheduler Guide,结合自己的实践经验,对Capacity Scheduler的主要配置参数进行总结。以下标记为红色的部分大都是自己曾踩过坑的地方,希望能给大家带来帮助。
mapred.capacity-scheduler.queue.<queue-name>.capacity:设置调度器中各个queue的容量,这里指的是占用的集群的slots的百分比,需要注意的是,所有queue的该配置项加起来必须小于等于100,否则会导致JobTracker启动失败。
mapred.capacity-scheduler.queue.<queue-name>.maximum-capacity:设置调度器中各个queue最大可以占有的容量,默认为-1表示最大可以占有集群100%的资源,和设置为100的效果是一样的。
mapred.capacity-scheduler.queue.<queue-name>.minimum-user-limit-percent:当queue中多个用户出现slots竞争的时候,限制每个用户的slots资源的百分比。举个例子,当minimum-user-limit-percent设置为25%时候,如果queue中有多余4个用户同时提交job,那么调度器保证每个用户占有的slots不超过queue中slots数的25%,默认为100表示不对用户作限制。
mapred.capacity-scheduler.queue.<queue-name>.user-limit-factor:设置queue中用户可占用queue容量的系数,默认为1表示,queue中每个用户最多只能占有queue的容量(即mapred.capacity-scheduler.queue.<queue-name>.capacity),因此,需要注意的是,如果queue中只有一个用户提交job,且希望用户在集群不繁忙时候可扩展到mapred.capacity-scheduler.queue.<queue-name>.maximum-capacity指定的slots数,则必须相应调大user-limit-factor这个系数。
mapred.capacity-scheduler.queue.<queue-name>.supports-priority:设置调度器中各个queue是否支持job优先级,不用过多解释。
mapred.capacity-scheduler.maximum-system-jobs:设置调度器中各个queue中合起来共计可初始化后并发执行的job数,需要注意的是,各个queue会按照自己占有集群slots资源的比例(即mapred.capacity-scheduler.queue.<queue-name>.capacity)决定每个queue最多同时并发执行的job数!举个例子,假设maximum-system-jobs为20个,而queue1占集群10%资源,那么意味着queue1最多可同时并发运行2个job,如果碰巧是运行时间比较长的job的话,将直接导致其他新提交的job被JobTracker阻塞不能进行初始化!
mapred.capacity-scheduler.queue.<queue-name>.maximum-initialized-active-tasks:设置queue中所有并发运行job包含的task数的上限值,如果超过此限制,则新提交到该queue中的job会被排队缓存到磁盘上。
mapred.capacity-scheduler.queue.<queue-name>.maximum-initialized-active-tasks-per-user:设置queue中每个特定用户并发运行job包含的task数的上限值,如果超过此限制,则该用户新提交到该queue中的job会被排队缓存到磁盘上。
mapred.capacity-scheduler.queue.<queue-name>.init-accept-jobs-factor:设置每个queue中可容纳接收的job总数(maximum-system-jobs * queue-capacity)的系数,举个例子,如果maximum-system-jobs为20,queue-capacity为10%,init-accept-jobs-factor为10,则当queue中job总数达到10*(20*10%)=20时,新的job将被JobTracker拒绝提交。