原文地址:https://program-park.github.io/2022/02/11/hadoop_42/
部分内容摘自尚硅谷、黑马等等培训资料
FairScheduler 是 Hadoop 可插拔的调度程序,提供了 YARN 应用程序公平地共享大型集群中资源的另一种方式。FairScheduler是一个将资源公平的分配给应用程序的方法,使所有应用在平均情况下随着时间的流逝可以获得相等的资源份额
。
Fair Scheduler 设计目标是为所有的应用分配公平的资源(对公平的定义通过参数来设置)。公平调度是一个分配资源给所有application的方法,平均来看,是随着时间的进展平等分享资源的
。
公平调度可以在多个队列间工作。如上图所示,假设有两个用户 A 和 B,分别拥有一个队列:
全部集群资源
;各自获得一半的集群资源
。FairScheduler 将应用组织到队列中,并在这些队列之间公平地共享资源。默认情况下,所有用户共享一个名为default的队列。如果应用明确在容器资源请求中指定了队列,则该请求将提交到指定的队列。可以通过配置,根据请求中包含的用户名或组分配队列。在每个队列中,使用调度策略在运行的应用程序之间共享资源。默认设置是基于内存的公平共享,但是也可以配置具有优势资源公平性的 FIFO 和多资源。
要使用 Fair Scheduler,首先在yarn-site.xml
配置文件进配置:
<property>
<name>yarn.resourcemanager.scheduler.classname>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairSchedulervalue>
property>
Fair Scheduler的配置文件,位于类路径下,默认文件名fair-scheduler.xml
,通过属性指定:
<property>
<name>yarn.scheduler.fair.allocation.filename>
<value>fair-scheduler.xmlvalue>
property>
若没有fair-scheduler.xml
这个配置文件,Fair Scheduler 采用的分配策略:调度器会在用户提交第一个应用时为其自动创建一个队列,队列的名字就是用户名,所有的应用都会被分配到相应的用户队列中。
定制 Fair Scheduler 涉及到 2 个文件。首先,scheduler有关的选项
可以在yarn-site.xml
中配置。此外,多数情况,用户需要创建一个 “allocation” 文件来列举存在的 queues 和它们相应的 weights和capacities。这个“allocation”文件每隔10秒钟加载一次,更新的配置可以更快的生效
。
在HADOOP_CONF/yarn-site.xml
中,主要用于配置调度器级别的参数。
元素实现的。所有的队列都是
队列的孩子,即使没有配到
元素里。在这个配置中,把dev
队列有分成了eng
和science
两个队列。权重属性
(权重就是对公平的定义),并把这个属性作为公平调度的依据
。在每个资源池的配置项中,有个 weight 属性(默认为 1),标记了资源池的权重,当资源池中有任务等待,并且集群中有空闲资源时候,每个资源池可以根据权重获得不同比例的集群空闲资源。
40:60
资源给prod
和dev
时便视作公平,eng
和science
队列没有定义权重,则会被平均分配
。按用户自动创建的队列,它们仍有权重并且权重值为1
。
元素定义了一个规则列表,其中的每个规则会被逐个尝试直到匹配成功
。create
参数,用于表明该规则是否能够创建新队列
。create默认值为true
;如果设置为 false 并且 Rule 要放置 app 到一个 allocations file 没有配置的队列,那么继续应用下一个 Rule;specified
,则会把应用放到它指定的队列中
,若这个应用没有指定队列名或队列名不存在,则说明不匹配这个规则,然后尝试下一个规则;primaryGroup
规则会尝试把应用放在以用户所在的Unix组名命名的队列中
,如果没有这个队列,不创建队列转而尝试下一个规则;default
规则,把应用放在dev.eng队列中
;不配置queuePlacementPolicy规则
,调度器则默认采用如下规则:抢占就是允许调度器杀掉占用超过其应占份额资源队列的containers
,这些 containers 资源便可被分配到应该享有这些份额资源的队列中。需要注意抢占会降低集群的执行效率,因为被终止的containers需要被重新执行
。yarn.scheduler.fair.preemption=true
来启用抢占功能。此外,还有两个参数用来控制抢占的过期时间(这两个参数默认没有配置,需要至少配置一个来允许抢占 Container):
为所有队列配置这个阈值;还可在
元素内配置
元素来为某个队列指定超阈值,默认是 0.5。
为所有队列配置这个超时时间;还可在
元素内配置
元素来为某个队列指定超时时间。fair share preemption timeout
指定时间内未获得平等的资源的一半(这个比例可以配置),调度器则会进行抢占 containers。
为所有队列配置这个超时时间;还可在
元素内配置
元素来为某个队列指定超时时间。minimum share preemption timeout
指定的时间内未获得最小的资源保障,调度器就会抢占 containers。资源设置格式:X表示内存,单位为MB;Y表示虚拟CPU Core核数
;注意分隔符最小资源保证:
最大资源限制
根据用户组分配资源池 ,假设在生产环境 Yarn 中,总共有四类用户需要使用集群,开发用户、测试用户、业务 1 用户、业务 2 用户。为了使其提交的任务不受影响,在 Yarn 上规划配置了五个资源池,分别为 dev_group(开发用户组资源池)
、test_group(测试用户组资源池)
、business1_group(业务1用户组资源池)
、business2_group(业务2用户组资源池)
、default(只分配了极少资源
)。并根据实际业务情况,为每个资源池分配了相应的资源及优先级等。
<allocations>
<userMaxAppsDefault>30userMaxAppsDefault>
<defaultQueueSchedulingPolicy>drfdefaultQueueSchedulingPolicy>
<queue name="root">
<aclSubmitApps> aclSubmitApps>
<aclAdministerApps> aclAdministerApps>
<queue name="default">
<minResources>2000 mb, 1 vcoresminResources>
<maxResources>10000 mb, 1 vcoresmaxResources>
<maxRunningApps>1maxRunningApps>
<schedulingMode>fifoschedulingMode>
<weight>0.5weight>
<aclSubmitApps>*aclSubmitApps>
queue>
<queue name="dev_group">
<minResources>200000 mb, 33 vcoresminResources>
<maxResources>300000 mb, 90 vcoresmaxResources>
<maxRunningApps>150maxRunningApps>
<schedulingMode>drfschedulingMode>
<weight>2.5weight>
<aclSubmitApps> dev_groupaclSubmitApps>
<aclAdministerApps> hadoop,dev_groupaclAdministerApps>
queue>
<queue name="test_group">
<minResources>70000 mb, 20 vcoresminResources>
<maxResources>95000 mb, 25 vcoresmaxResources>
<maxRunningApps>60maxRunningApps>
<schedulingMode>fairschedulingMode>
<weight>1weight>
<aclSubmitApps> test_groupaclSubmitApps>
<aclAdministerApps> hadoop,test_groupaclAdministerApps>
queue>
<queue name="business1_group">
<minResources>75000 mb, 15 vcoresminResources>
<maxResources>100000 mb, 20 vcoresmaxResources>
<maxRunningApps>80maxRunningApps>
<schedulingMode>drfschedulingMode>
<weight>1weight>
<aclSubmitApps> business1_groupaclSubmitApps>
<aclAdministerApps> hadoop,business1_groupaclAdministerApps>
queue>
<queue name="business2_group">
<minResources>75000 mb, 15 vcoresminResources>
<maxResources>102400 mb, 20 vcoresmaxResources>
<maxRunningApps>80maxRunningApps>
<schedulingMode>drfschedulingMode>
<weight>1weight>
<aclSubmitApps> business2_groupaclSubmitApps>
<aclAdministerApps> hadoop,business2_groupaclAdministerApps>
queue>
queue>
<queuePlacementPolicy>
<rule name="primaryGroup" create="false"/>
<rule name="secondaryGroupExistingQueue" create="false"/>
<rule name="default"/>
queuePlacementPolicy>
allocations>
由于公司的 hadoop 集群的计算资源不是很充足,需要开启 yarn 资源队列的资源抢占。
<allocations>
<defaultQueueSchedulingPolicy>drfdefaultQueueSchedulingPolicy>
<defaultMinSharePreemptionTimeout>300defaultMinSharePreemptionTimeout>
<pool name="default">
<maxResources>0 mb, 0 vcoresmaxResources>
<maxRunningApps>0maxRunningApps>
<weight>0.0weight>
pool>
<pool name="online">
<minResources>24000 mb, 12 vcoresminResources>
<maxResources>48000 mb, 24 vcoresmaxResources>
<maxRunningApps>12maxRunningApps>
<weight>3.0weight>
pool>
<pool name="develop">
<minResources>12000 mb, 6 vcoresminResources>
<maxResources>24000mb, 12 vcoresmaxResources>
<maxRunningApps>6maxRunningApps>
<weight>2.0weight>
pool>
<pool name="bi">
<minResources>12000 mb, 6 vcoresminResources>
<maxResources>24000 mb, 12 vcoresmaxResources>
<maxRunningApps>6maxRunningApps>
<weight>1.0weight>
pool>
<userMaxAppsDefault>5userMaxAppsDefault>
<queuePlacementPolicy>
<rule name="user" create="false" />
<rule name="primaryGroup" create="false" />
<rule name="secondaryGroupExistingQueue" create="false" />
<rule name="default" queue="develop"/>
queuePlacementPolicy>
allocations>
下面以三台机器为例,进行初步设置,运行程序 MapReduce 或 Spark 程序演示。
开启 Fair Scheduler,相关参数配置,添加到HADOOP_CONF/yarn-site.xml
中
<property>
<name>yarn.resourcemanager.scheduler.classname>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairSchedulervalue>
property>
<property>
<name>yarn.scheduler.fair.allocation.filename>
<value>fair-scheduler.xmlvalue>
property>
<property>
<name>yarn.scheduler.fair.user-as-default-queuename>
<value>truevalue>
property>
<property>
<name>yarn.scheduler.fair.allow-undeclared-poolsname>
<value>falsevalue>
property>
HADOOP_CONF/fair-scheduler.xml
,内容如下:
<allocations>
<defaultQueueSchedulingPolicy>drfdefaultQueueSchedulingPolicy>
<queue name="batch_mr">
<weight>30weight>
<schedulingPolicy>fairschedulingPolicy>
queue>
<queue name="engin_spark">
<weight>55weight>
<queue name="etl"/>
<queue name="ml"/>
queue>
<queue name="default">
<weight>15weight>
<schedulingPolicy>fifoschedulingPolicy>
queue>
<queuePlacementPolicy>
<rule name="specified" create="false"/>
<rule name="primaryGroup" create="false"/>
<rule name="default" queue="default"/>
queuePlacementPolicy>
allocations>
HADOOP_HOME=/export/server/hadoop
${HADOOP_HOME}/bin/yarn jar \
${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.4.jar \
wordcount \
-Dmapreduce.job.queuename=batch_mr \
datas/input.data /datas/output
HADOOP_HOME=/export/server/hadoop
${HADOOP_HOME}/bin/yarn jar \
${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.4.jar \
wordcount \
datas/input.data /datas/output
公平调度器的运行流程就是RM去启动FairScheduler,SchedulerDispatcher两个服务,这两个服务各自负责 update 线程,handle 线程。