yarn的调度器
三种调度器
1.FIFO Scheduler
把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,等最前面的应用需求满足后再给下一个分配,以此类推。不适用于共享集群,大的应用可能会占用所有集群资源,这就导致其它应用被阻塞。
2.Capacity Scheduler
http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/CapacityScheduler.html
允许多个组织共享整个集群,每个组织获得集群的一部分计算能力,通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。在一 个队列内部,资源的调度是采用的是FIFO策略。
3.Fair Scheduler
http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/FairScheduler.html
官网介绍
公平调度器当第一个用户提交应用占用集群全部资源,第二个用户提交应用分配一半资源。第一个用户再提交第二个应用需要等待第一个应用释放container和第一个应用平分资源。
<property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value> </property>
Fair调度器的配置文件位于类路径下的fair-scheduler.xml文件中,这个路径可以通过yarn.scheduler.fair.allocation.file属性进行修改。
官网提供例子:
<?xml version="1.0"?> <allocations> <queue name="sample_queue"> <minResources>10000 mb,0vcores</minResources> <maxResources>90000 mb,0vcores</maxResources> <maxRunningApps>50</maxRunningApps> <maxAMShare>0.1</maxAMShare> <weight>2.0</weight> <schedulingPolicy>fair</schedulingPolicy> <queue name="sample_sub_queue"> <aclSubmitApps>charlie</aclSubmitApps> <minResources>5000 mb,0vcores</minResources> </queue> </queue> <queueMaxAMShareDefault>0.5</queueMaxAMShareDefault> <!-- Queue 'secondary_group_queue' is a parent queue and may have user queues under it --> <queue name="secondary_group_queue" type="parent"> <weight>3.0</weight> </queue> <user name="sample_user"> <maxRunningApps>30</maxRunningApps> </user> <userMaxAppsDefault>5</userMaxAppsDefault> <queuePlacementPolicy> <rule name="specified" /> <rule name="primaryGroup" create="false" /> <rule name="nestedUserQueue"> <rule name="secondaryGroupExistingQueue" create="false" /> </rule> <rule name="default" queue="sample_queue"/> </queuePlacementPolicy> </allocations>
自己修改fair-scheduler.xml:
<?xml version="1.0"?> <allocations> <queue name="sample_queue"> <weight>2.0</weight> <schedulingPolicy>fair</schedulingPolicy> <queue name="sample_sub_queue"> </queue> </queue> <queueMaxAMShareDefault>0.5</queueMaxAMShareDefault> <!-- Queue 'secondary_group_queue' is a parent queue and may have user queues under it --> <queue name="secondary_group_queue"> <weight>3.0</weight> </queue> <user name="sample_user"> <maxRunningApps>30</maxRunningApps> </user> <userMaxAppsDefault>5</userMaxAppsDefault> <queuePlacementPolicy> <rule name="specified" /> <rule name="primaryGroup" create="false" /> <rule name="nestedUserQueue"> <rule name="secondaryGroupExistingQueue" create="false" /> </rule> <rule name="default" queue="sample_queue.sample_sub_queue" /> </queuePlacementPolicy> </allocations>
1 cd $HADOOP_HOME 2 3 hadoop jar hadoop-mapreduce-examples-2.7.1.2.3.4.0-3485.jar pi 1 10
指定队列
1 hadoop jar hadoop-mapreduce-examples-2.7.1.2.3.4.0-3485.jar pi -Dmapred.job.queue.name=secondary_group_queue 1 10
<?xml version="1.0"?> <allocations> <queue name="sample_queue"> <weight>2.0</weight> <schedulingPolicy>fair</schedulingPolicy> <queue name="sample_sub_queue"> </queue> <queue name="sample_sub_queue1" /> </queue> <queueMaxAMShareDefault>1.0</queueMaxAMShareDefault> <!-- Queue 'secondary_group_queue' is a parent queue and may have user queues under it --> <queue name="secondary_group_queue"> <weight>3.0</weight> </queue> <user name="sample_user"> <maxRunningApps>30</maxRunningApps> </user> <userMaxAppsDefault>5</userMaxAppsDefault> <queuePlacementPolicy> <rule name="specified" /> <rule name="primaryGroup" create="false" /> <rule name="default" queue="sample_queue.sample_sub_queue" /> </queuePlacementPolicy> </allocations>
i 配置参数
官方配置参数
yarn.scheduler.fair.allocation.file
资源分配文件的路径,该文件包含配置每个队列的属性
yarn.scheduler.fair.user-as-default-queue
是否按照提交者的name作为默认的队列名字,不设置或者设置成false,所有的作业都共享一个“default”队列。该项的默认值是true。如果队列的资源策略在allocation file中配置了,那么该项忽略
yarn.scheduler.fair.preemption
是否启用抢占,默认是false
yarn.scheduler.fair.preemption.cluster-utilization-threshold
默认值0.8f,最多可以抢占到集群所有资源的80%
yarn.scheduler.fair.sizebasedweight
是否根据每个作业所需的资源大小来分配各个作业的资源,设置为true,作业的权重为lnE/log2(E是该作业所需的最大内存资源),默认值是false,在一个队列内部分配资源时,默认情况下,采用公平轮询的方法将资源分配给各个作业
yarn.scheduler.fair.assignmultiple
是否启动批量分配功能。当一个节点出现大量资源时,可以一次分配完成,也可以多次分配完成。默认情况下,该参数值为false。
yarn.scheduler.fair.max.assign
如果开启批量分配功能,可指定一次分配的container数目。默认情况下,该参数值为-1,表示不限制。
yarn.scheduler.fair.locality.threshold.node
当应用程序请求某个节点上资源时,它可以接受的可跳过的最大资源调度机会。当按照分配策略,可将一个节点上的资源分配给某个应用程序时,如果该节点不是作业期望的节点,可选择跳过该分配机会暂时将资源分配给其他作业,直到出现满足该作业所需的节点资源出现。通常而言,一次心跳代表一次调度机会, 而该参数则表示跳过调度机会占节点总数的比例,默认情况下,该值为-1.0,表示不跳过任何调度机会。
yarn.scheduler.fair.locality.threshold.rack
当应用程序请求某个机架上资源时,它可以接受的可跳过的最大资源调度机会。
yarn.scheduler.fair.allow-undeclared-pools
设置为true时,将使用默认设置创建在作业中指定但未明确配置的池。设置为false时,将在名为“default”的池中运行作业指定的未明确配置的池。此设置适用于应用程序明确指定某个池时以及应用程序运行所在的池的名称为与该应用程序关联的用户名的情况。
yarn.scheduler.fair.update-interval-ms
默认值500ms,锁住调度器重新进行计算作业所需资源的间隔
ii fair-scheduler.xml
官方配置参数
minResources
最少资源保证量,设置格式为“X mb, Y vcores”,当一个队列的最少资源保证量未满足时,它将优先于其他同级队列获得资源,对于不同的调度策略,最少资源保证量的含义不同,对于fair策 略,则只考虑内存资源,即如果一个队列使用的内存资源超过了它的最少资源量,则认为它已得到了满足;对于drf策略,则考虑主资源使用的资源量,即如果一 个队列的主资源量超过它的最少资源量,则认为它已得到了满足。
maxResources
最多可以使用的资源量,fair scheduler会保证每个队列使用的资源量不会超过该队列的最多可使用资源量。
maxRunningApps
最多同时运行的应用程序数目。通过限制该数目,可防止超量Map Task同时运行时产生的中间输出结果撑爆磁盘。
maxAMShare
限制用于运行作业的共享资源,该属性只能配置在叶子队列,设置成1.0f,am在该队列中可以获得100%的memory和cpu资源,设置成-1.0f禁用该项。默认值是0.5f
weight
默认值是1,设置成2队列将会有2倍的能力去获得自己需要的资源,是一个权重配比
schedulingPolicy
队列采用的调度模式,可以是fifo、fair或者drf。
aclSubmitApps
可向队列中提交应用程序的Linux用户或用户组列表,默认情况下为“*”,表示任何用户均可以向该队列提交应用程序。需要注意的是,该属性具有继承性,即子队列的列表会继承父队列的列表。配置该属性时,用户之间或用户组之间用“,”分割,用户和用户组之间用空格分割,比如“user1, user2 group1,group2”。
aclAdministerApps
该队列的管理员列表。一个队列的管理员可管理该队列中的资源和应用程序,比如可杀死任意应用程序。
minSharePreemptionTimeout
最小共享量抢占时间。如果一个队列在该时间内使用的资源量一直低于最小资源量,则开始抢占资源。
fairSharePreemptionTimeout
公平共享量抢占时间。如果一个队列在该时间内使用资源量一直低于公平共享量的一半,则开始抢占资源。
fairSharePreemptionThreshold
队列资源抢占的阈值,如果队列等待了上一个选项的时间还没有获得资源,将从别的队列容器中抢占资源。
iii 规则
<queuePlacementPolicy> <rule name="specified" /> <rule name="primaryGroup" create="false" /> <rule name="nestedUserQueue"> <rule name="secondaryGroupExistingQueue" create="false" /> </rule> <rule name="default" queue="sample_queue.sample_sub_queue" /> </queuePlacementPolicy>
这些规则按照顺序生效,可包含参数,所有规则接受一个"create"参数,该参数表示该条规则是否能够创建一个新的队列,并且该参数默认是是true,如果设置成false该规则会将作业放置到一个没有在资源分配文件中配置的队列,然后继续下一个规则。
specified
作业提交到指定的queue中(提交者自己可指定),如果提交时未用参数指定队列,那么将进入“default”队列,如果提交时指定一个不存在的队列,那么该作业被拒绝。
user
作业按照提交者的name提交到相应的队列,name(队列名)中的“.”会被“_dot_”替换,如:用户“one.job”的队列名字为“one_dot_job”
primaryGroup
作业按照提交者所在的组(linux中的用户和组)提交到相应的队列,name(队列名)中的“.”会被“_dot_”替换,如:用户所属的组“one.job”的队列名字为“one_dot_job”
secondaryGroupExistingQueue
同上一个参数,组换成附属组(linux中组)
nestedUserQueue
和user参数相似,不同点:该配置参数在任何parent queue中都能创建队列,user配置只能在root队列下创建。
default
作业被提交到该配置参数的“queue”属性中,如果未指定“queue”,那么就提交到“root.default”队列中
reject
拒绝提交作业