一、Fair Scheduler相关参数
Fair Scheduler的配置包括两部分;
(一)yarn_site.xml,主要用于配置调度器级别的参数;
(二)fair_scheduler.xml,主要用于配置各个队列的资源量、权重等信息。
首先在yarn-site.xml中,将配置参数yarn.resourcemanager.scheduler.class设置为:org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler。
1. 配置文件yarn-site.xml
(1)yarn.scheduler.fair.allocation.file :自定义XML配置文件所在位置,该文件主要用于描述各个队列的属性,比如资源量、权重等,具体配置格式将在后面介绍。
(2)yarn.scheduler.fair.user-as-default-queue:当应用程序未指定队列名时,是否指定用户名作为应用程序所在的队列名。如果设置为false或者未设置,所有未知队列的应用程序将被提交到default队列中,默认值为true。
设置为TRUE,当任务中未指定资源池的时候,将以用户名作为资源池名,这个配置实现了根据用户名自动分配资源池。
(3)yarn.scheduler.fair.preemption:是否启用抢占机制,默认值是false。
(4)yarn.scheduler.fair.sizebasedweight:在一个队列内部分配资源时,默认情况下,采用公平轮询的方法将资源分配各各个应用程序,而该参数则提供了另外一种资源分配方式:按照应用程序资源需求数目分配资源,即需求资源数量越多,分配的资源越多。默认情况下,该参数值为false。
(5)yarn.scheduler.assignmultiple:是否启动批量分配功能。当一个节点出现大量资源时,可以一次分配完成,也可以多次分配完成。默认情况下,该参数值为false。
(6) yarn.scheduler.fair.max.assign:如果开启批量分配功能,可指定一次分配的container数目。默认情况下,该参数值为-1,表示不限制。
(7)yarn.scheduler.fair.locality.threshold.node:当应用程序请求某个节点上资源时,它可以接受的可跳过的最大资源调度机会。当按照分配策略,可将一个节点上的资源分配给某个应用程序时,如果该节点不是应用程序期望的节点,可选择跳过该分配机会暂时将资源分配给其他应用程序,直到出现满足该应用程序需的节点资源出现。通常而言,一次心跳代表一次调度机会,而该参数则表示跳过调度机会占节点总数的比例,默认情况下,该值为-1.0,表示不跳过任何调度机会。
(8)yarn.scheduler.fair.locality.threshold.rack:当应用程序请求某个机架上资源时,它可以接受的可跳过的最大资源调度机会。
(9)yarn.scheduler.increment-allocation-mb:内存规整化单位,默认是1024,这意味着,如果一个Container请求资源是1.5GB,则将被调度器规整化为ceiling(1.5 GB / 1GB) * 1G=2GB。
(10)yarn.scheduler.increment-allocation-vcores:虚拟CPU规整化单位,默认是1,含义与内存规整化单位类似。
(11)yarn.scheduler.fair.allow-undeclared-pools:如果这是true,新的队列可以在提交申请时被创建,无论是因为它们是由提交者指定为应用程序的队列中,或者因为它们是由用户的默认队列属性放在那里。如果此为假,任何时间的应用程序将被放置在一个未在该分配文件中指定一个队列,它被放置在“默认”的队列来代替。默认为true。如果队列放置策略中给出了配置文件,则忽略此属性。
是否允许创建未定义的资源池。
如果设置为TRUE,YARN将会自动创建任务中指定的未定义过的资源池。设置为FALSE后,任务中指定的未定义的资源池将无效,该任务会被分配到default资源池中。
2. 自定义配置文件fair-scheduler.xml
Fair Scheduler允许用户将队列信息专门放到一个配置文件(默认是fair-scheduler.xml),该文件内的配置分四部分组成:
(一)队列列表
对于每个队列,管理员可配置以下几个选项:
(1)minResources :最少资源保证量,设置格式为“X mb, Y vcores”,当一个队列的最少资源保证量未满足时,它将优先于其他同级队列获得资源,对于不同的调度策略(后面会详细介绍),最少资源保证量的含义不同,对于fair策略,则只考虑内存资源,即如果一个队列使用的内存资源超过了它的最少资源量,则认为它已得到了满足;对于drf策略,则考虑主资源使用的资源量,即如果一个队列的主资源量超过它的最少资源量,则认为它已得到了满足。
(2)maxResources:最多可以使用的资源量,fair scheduler会保证每个队列使用的资源量不会超过该队列的最多可使用资源量。
(3) maxRunningApps:最多同时运行的应用程序数目。通过限制该数目,可防止超量Map Task同时运行时产生的中间输出结果撑爆磁盘。
(4)maxAMShare:该参数限制可以将队列拥有的公平共享量中的多少用于AM中。该参数只能用于叶子队列中。举例,如果将其设置为1.0f,那么叶子队列中的AM可以使用公平共享量的所有资源。设置为-1.0f的话,调度器将不具备该特性,AM所拥有的共享量amShare也不会被检查。该参数默认值为0.5f。
(5)weight:代表队列所占的权重,默认是1,如果某个队列的该参数配置为2,那么它所获取的资源是该参数为1的队列的两倍。
(6)minSharePreemptionTimeout:最小共享量抢占时间。如果一个资源池在该时间内使用的资源量一直低于最小资源量,则开始抢占资源。
(7)fairSharePreemptionTimeout:公平共享量抢占时间。如果一个资源池在该时间内使用资源量一直低于公平共享量的一半,则开始抢占资源。
(8)fairSharePreemptionThreshold: 如果队列在fair share preemption timeout指定时间内未获得平等的资源的一定比例,调度器则会进行抢占containers。该参数就是配置该比例的,默认为0.5。
(9)schedulingMode:队列采用的调度模式,可以是fifo、fair或者别的调度模式。
(10)aclSubmitApps:可向队列中提交应用程序的Linux用户或用户组列表,默认情况下为“*”,表示任何用户均可以向该队列提交应用程序。需要注意的是,该属性具有继承性,即子队列的列表会继承父队列的列表。配置该属性时,用户之间或用户组之间用“,”分割,用户和用户组之间用空格分割,比如
“user1, user2 group1, group2”。
(11)aclAdministerApps:该队列的管理员列表。一个队列的管理员可管理该队列中的资源和应用程序,比如可杀死任意应用程序。
(二)USER参数列表
管理员也可为单个用户添加maxRunningJobs属性限制其最多同时运行的应用程序数目。
(三)默认参数
管理员也可通过以下参数设置以上属性的默认值:
(1)queueMaxAppsDefault:队列的maxRunningApps属性的默认值。
(2)defaultMinSharePreemptionTimeout:队列minSharePreemptionTimeout属性的默认值。
(3)defaultQueueSchedulingMode:队列的schedulingMode属性的默认值。
(4)userMaxAppsDefault:用户的maxRunningJobs属性的默认值
(5)defaultFairSharePreemptionTimeout: 队列的fairSharePreemptionTimeout属性的默认值。
(6)defaultFairSharePreemptionThreshold:队列的fairSharePreemptionThreshold属性的默认值。
(7)queueMaxAMShareDefault:队列的maxAMShare的默认值。
(四)queuePlacementPolicy
管理员可通过配置以下参数,规定作业提交的队列。
queuePlacementPolicy
该项包含了一组告知调度器如何将作业放置进队列的规则。这些规则按照配置的顺序生效,可以包含参数,所有的规则接受一个“create”的参数,该参数表示该条规则是否能够创建一个新的队列,并且该参数默认是是true,如果设置成false该规则会将作业放置到一个没有在资源分配文件中中配置的队列,然后继续下一个规则。最后一条规则必须无法往下继续,有效的规则如下:
specified | 作业提交到指定的queue中(提交者自己可指定),如果提交时未用参数指定队列,那么将进入“default”队列,如果提交时指定一个不存在的队列,那么该作业被拒绝。 |
user | 作业按照提交者的name提交到相应的队列,name(队列名)中的“.”会被“_dot_”替换,如:用户“first.last”的队列名字为“first_dot_last” |
primaryGroup | 作业按照提交者所在的组(linux中的用户和组)提交到相应的队列,name(队列名)中的“.”会被“_dot_”替换,如:用户所属的组“one.two”的队列名字为“one_dot_two” |
secondaryGroupExistingQueue | 同上一个参数,组换成附属组(linux中组的概念) |
nestedUserQueue | 和user参数类似,不同点:该配置在任何parent queue中都能创建队列,二user配置只能在root队列下创建。 |
default | 作业被提交到该配置的“queue”属性中,如果未指定“queue”,那么就提交到“root.default”队列中 |
reject | 拒绝提交作业 |
二、RM的内存资源配置, 配置的是资源调度相关
RM1:yarn.scheduler.minimum-allocation-mb 分配给AM单个容器可申请的最小内存
RM2:yarn.scheduler.maximum-allocation-mb 分配给AM单个容器可申请的最大内存
注:
- 这两个值是Yarn平台特性,应在yarn-sit.xml中配置好
- 单个容器可申请的最小与最大内存,应用在运行申请内存时不能超过最大值,小于最小值则分配最小值
- 最小值可以计算一个节点最大Container数量
- 一旦设置,不可动态改变
三、NM的内存资源配置,配置的是硬件资源相关
NM1:yarn.nodemanager.resource.memory-mb 节点最大可用内存
NM2:yarn.nodemanager.vmem-pmem-ratio 虚拟内存率,默认2.1
注:
- 这两个值是Yarn平台特性,应在yarn-sit.xml中配置
- RM1、RM2的值均不能大于NM1的值
- NM1可以计算节点最大最大Container数量,max(Container)=NM1/RM1
- 一旦设置,不可动态改变
四、AM内存配置相关参数,配置的是任务相关
AM1:mapreduce.map.memory.mb 分配给map Container的内存大小
AM2:mapreduce.reduce.memory.mb 分配给reduce Container的内存大小
- 此处以MapReduce为例进行说明,这两个值是AM特性,应在mapred-site.xml中配置
- 这两个值应该在RM1和RM2这两个值之间
- AM2的值最好为AM1的两倍
- 这两个值可以在启动时改变
AM3:mapreduce.map.java.opts:运行map任务的jvm参数,如-Xmx,-Xms等选项
AM4: mapreduce.reduce.java.opts:运行reduce任务的jvm参数,如-Xmx,-Xms等选项
注:
- 这两个值应该在AM1和AM2之间
五、对二、三、四这些配置概念的理解
知道有这些参数,还需理解其如何分配,下面我就一副图让大家更形象的了解各个参数的含义。
如上图所示,先看最下面褐色部分,
(1)AM参数mapreduce.map.memory.mb=1536MB,表示AM要为map Container申请1536MB资源,但RM实际分配的内存却是2048MB,因为yarn.scheduler.mininum-allocation-mb=1024MB,这定义了RM最小要分配1024MB,1536MB超过了这个值,所以实际分配给AM的值为2048MB(这涉及到了规整化因子,关于规整化因子,在本文最后有介绍)。
(2)AM参数mapreduce.map.java.opts=-Xmx 1024m,表示运行map任务的jvm内存为1024MB,因为map任务要运行在Container里面,所以这个参数的值略微小于mapreduce.map.memory.mb=1536MB这个值。
(3)NM参数yarn.nodemanager.vmem-pmem-radio=2.1,这表示NodeManager可以分配给map/reduce Container 2.1倍的虚拟内存,安照上面的配置,实际分配给map Container容器的虚拟内存大小为2048*2.1=3225.6MB,若实际用到的内存超过这个值,NM就会kill掉这个map Container,任务执行过程就会出现异常。
(4)AM参数mapreduce.reduce.memory.mb=3072MB,表示分配给reduce Container的容器大小为3072MB,而map Container的大小分配的是1536MB,从这也看出,reduce Container容器的大小最好是map Container大小的两倍。
(5)NM参数yarn.nodemanager.resource.mem.mb=24576MB,这个值表示节点分配给NodeManager的可用内存,也就是节点用来执行yarn任务的内存大小。这个值要根据实际服务器内存大小来配置,比如我们hadoop集群机器内存是128GB,我们可以分配其中的80%给yarn,也就是102GB。
(6)上图中RM的两个参数分别1024MB和8192MB,分别表示分配给AM map/reduce Container的最大值和最小值。
六、YARN中内存资源的调度
YARN允许用户配置每个节点上可用的物理内存资源
YARN配置的只是自己可以使用的,配置参数如下:
(1)yarn.nodemanager.resource.memory-mb:表示该节点上YARN可使用的物理内存总量,默认是8192(MB),注意,如果你的节点内存资源不够8GB,则需要调减小这个值,而YARN不会智能的探测节点的物理内存总量。
(2)yarn.nodemanager.vmem-pmem-ratio:任务每使用1MB物理内存,最多可使用虚拟内存量,默认是2.1。
(3)yarn.nodemanager.pmem-check-enabled:是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true。
(4)yarn.nodemanager.vmem-check-enabled:是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true。
(5)yarn.scheduler.minimum-allocation-mb:单个任务可申请的最少物理内存量,默认是1024(MB),如果一个任务申请的物理内存量少于该值,则该对应的值改为这个数。
(6)yarn.scheduler.maximum-allocation-mb:单个任务可申请的最多物理内存量,默认是8192(MB)。
七、YARN中CPU资源的调度
目前的CPU被划分成虚拟CPU(CPU virtual Core),这里的虚拟CPU是YARN自己引入的概念。用户提交作业时,可以指定每个任务需要的虚拟CPU个数。在YARN中,CPU相关配置参数如下:
(1)yarn.nodemanager.resource.cpu-vcores:表示该节点上YARN可使用的虚拟CPU个数,默认是8,注意,目前推荐将该值设值为与物理CPU核数数目相同。如果你的节点CPU核数不够8个,则需要调减小这个值,而YARN不会智能的探测节点的物理CPU总数。
(2)yarn.scheduler.minimum-allocation-vcores:单个任务可申请的最小虚拟CPU个数,默认是1,如果一个任务申请的CPU个数少于该数,则该对应的值改为这个数。
(3)yarn.scheduler.maximum-allocation-vcores:单个任务可申请的最多虚拟CPU个数,默认是32。
相关推荐:
数据仓库之Hive-CSDN博客