10.4 Capacity Scheduler实现
Capacity Scheduler[1]是Yahoo!开发的多用户调度器。它以队列为单位划分资源,每个队列可设定一定比例的资源最低保证和使用上限,同时,每个用户也可设定一定的资源使用上限以防止资源滥用,而当一个队列的资源有剩余时,可暂时将剩余资源共享给其他队列。总之,Capacity Scheduler主要有以下几个特点。
❑容量保证:管理员可为每个队列设置资源最低保证和资源使用上限,而所有提交到该队列的作业共享这些资源。
❑灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的作业提交,则其他队列释放资源后会归还给该队列。相比于HOD调度器,这种资源灵活分配的方式可明显提高资源利用率。
❑多重租赁:支持多用户共享集群和多作业同时运行。为防止单个作业、用户或者队列独占集群中的资源,管理员可为之增加多重约束(比如单个作业同时运行的任务数等)。
❑支持资源密集型作业:当一个作业的单个任务需要的资源高于默认设置时,可同时为其分配多个slot,但需要注意的是,当前仅支持内存密集型作业。
❑支持作业优先级:默认情况下,在每个队列中,空闲资源优先分配给最早提交的作业,但也可让其支持作业优先级,这样,优先级高的作业将优先获取资源(两个作业优先级相同时,再按照提交时间优先的原则分配资源)。需要注意的是,当前Capacity Scheduler还不支持资源抢占,也就是说,如果优先级高的作业提交时间晚于优先级低的作业,则高优先级作业需等待低优先级作业释放资源。
10.4.1 Capacity Scheduler功能介绍
Capacity Scheduler是一个多用户调度器。它设计了多层级别的资源限制条件以更好地让多用户共享一个Hadoop集群,比如队列资源限制、用户资源限制、用户作业数目限制等。为了能够更详尽地了解Capacity Scheduler的功能,我们从它的配置文件讲起。Capacity Scheduler有自己的配置文件,即存放在conf目录下的capacity-scheduler.xml。
在Capacity Scheduler的配置文件中,队列queueX的参数Y的配置名称为mapred.capacity-scheduler.queue.queueX.Y,为了简单起见,我们记为Y,则每个队列可以配置的参数如下。
❑capacity:队列的资源容量(百分比)。当系统非常繁忙时,应保证每个队列的容量得到满足,而如果每个队列作业较少,可将剩余资源共享给其他队列。注意,所有队列的容量之和应小于100。
❑maximum-capacity:队列的资源使用上限(百分比)。由于存在资源共享,因此一个队列使用的资源量可能超过其容量,而最多使用资源量可通过该参数限制。
❑supports-priority:是否支持作业优先级。默认情况下,每个队列内部,提交时间早的作业优先获得资源,而如果支持优先级,则优先级高的作业优先获得资源,如果两个作业优先级相同,则再进一步考虑提交时间。
❑minimum-user-limit-percent:每个用户最低资源保障(百分比)。任何时刻,一个队列中每个用户可使用的资源量均有一定的限制。当一个队列中同时运行多个用户的作业时,每个用户的可使用资源量在一个最小值和最大值之间浮动,其中,最小值取决于正在运行的作业数目,而最大值则由minimum-user-limit-percent决定。比如,假设minimum-user-limit-percent为25。当两个用户向该队列提交作业时,每个用户可使用资源量不能超过50%;如果三个用户提交作业,则每个用户可使用资源量不能超过33%;如果四个或者更多用户提交作业,则每个用户可使用资源量不能超过25%。
❑user-limit-factor:每个用户最多可使用的资源量(百分比)。比如,假设该值为30,则任何时刻,每个用户使用的资源量不能超过该队列容量的30%。
❑maximum-initialized-active-tasks:队列中同时被初始化的任务数目上限。通过设置该参数可防止因过多的任务被初始化而占用大量内存。
❑maximum-initialized-active-tasks-per-user:每个用户可同时被初始化的任务数目上限。
❑init-accept-jobs-factor:用于计算队列中可同时被初始化的作业数目上限,即为(init-accept-jobs-factor)×(maximum-system-jobs)×capacity/100
其中,maximum-system-jobs为系统中最多可被初始化的作业数目。
一个配置文件实例如下:
<configuration>
<property>
<name>mapred.capacity-scheduler.maximum-system-jobs</name>
<value>3000</value>
<description>系统中最多可被初始化的作业数目</description>
</property>
<property>
<name>mapred.capacity-scheduler.maximum-system-jobs</name>
<value>3000</value>
<description>Hadoop集群中最多同时被初始化的作业</description>
</property>
<property>
<name>mapred.capacity-scheduler.queue.myQueue.capacity</name>
<value>30</value>
<description>default队列的可用资源(百分比)</description>
</property>
<!—配置myQueue队列.—>
<property>
<name>mapred.capacity-scheduler.queue.myQueue.maximum-capacity</name>
<value>40</value>
<description>default队列的资源使用上限(百分比)</description>
</property>
<property>
<name>mapred.capacity-scheduler.queue.myQueue.supports-priority</name>
<value>false</value>
<description>是否考虑作业优先级</description>
</property>
<property>
<name>mapred.capacity-scheduler.queue.myQueue.minimum-user-limit-percent</name>
<value>100</value>
<description>每个用户最低资源保障(百分比)</description>
</property>
<property>
<name>mapred.capacity-scheduler.queue.myQueue.user-limit-factor</name>
<value>1</value>
<description>每个用户最多可使用的资源占队列总资源的比例</description>
</property>
<property>
<name>mapred.capacity-scheduler.queue.myQueue.maximum-initialized-active-tasks</name>
<value>200000</value>
<description>default队列可同时被初始化的任务数目</description>
</property>
<property>
<name>mapred.capacity-scheduler.queue.myQueue.maximum-initialized-active-tasks-per-
user</name>
<value>100000</value>
<description>default队列中每个用户可同时被初始化的任务数目</description>
</property>
<property>
<name>mapred.capacity-scheduler.queue.myQueue.init-accept-jobs-factor</name>
<value>10</value>
<description>default队列中可同时被初始化的作业数目,即该值与(maximum-system-jobs*
queue-capacity)的乘积</description>
</property>
<!—配置myQueue队列.—>
</configuration>
从上面这些参数可以看出,Capacity Scheduler将整个系统资源分成若干个队列,且每个队列有较为严格的资源使用限制,包括每个队列的资源容量限制、每个用户的资源量限制等。通过这些限制,Capacity Scheduler将整个Hadoop集群逻辑上划分成若干个拥有相对独立资源的子集群,而由于这些子集群实际上共用大集群中的资源,因此可以共享资源,相对于HOD而言,提高了资源利用率且降低了运维成本。
[1]http://hadoop. apache.org/docs/stable/capacity_scheduler.html