内容简介:版权声明:本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。QQ邮箱地址:1120746959@qq.com,如有任何技术交流,可随时联系。Capacity 调度器允许多个组织共享整个集群,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。除此之外,队列内部又可以垂直划分,这样一个
版权声明:本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。QQ邮箱地址:1120746959@qq.com,如有任何技术交流,可随时联系。
1 公平调度(资源不够也会运行,以最少的资源进行资源调度)
-
不够用时最多抢占其他队列的应用只有一个
-
Fair调度器的设计目标是为所有的应用分配公平的资源(对公平的定义可以通过参数来设置)。在上面的“Yarn调度器对比图”展示了一个队列中两个应用的公平调度;当然,公平调度在也可以在多个队列间工作。举个例子,假设有两个用户A和B,他们分别拥有一个队列。当A启动一个job而B没有任务时,A会获得全部集群资源;当B启动一个job后,A的job会继续运行,不过一会儿之后两个任务会各自获得一半的集群资源。如果此时B再启动第二个job并且其它job还在运行,则它将会和B的第一个job共享B这个队列的资源,也就是B的两个job会用于四分之一的集群资源,而A的job仍然用于集群一半的资源,结果就是资源最终在两个用户之间平等的共享。
-
Fair Scheduler允许用户将队列信息专门放到一个配置文件(默认是fair-scheduler.xml),对于每个队列,管理员可配置以下
-
以最大资源申请1
-
以最大资源申请2(原先任务不会做资源释放)
-
几个选项:
(1) minResources :最少资源保证量,设置格式为“X mb, Y vcores”,当一个队列的最少资源保证量未满足时,它将优先于其他同级队列获得资源,对于不同的调度策略,最少资源保证量的含义不同,对于fair策略,则只考虑内存资源,即如果一个队列使用的内存资源超过了它的最少资源量,则认为它已得到了满足;对于drf策略,则考虑主资源使用的资源量,即如果一个队列的主资源量超过它的最少资源量,则认为它已得到了满足。 (2) maxResources:最多可以使用的资源量,fair scheduler会保证每个队列使用的资源量不会超过该队列的最多可使用资源量。 (3) maxRunningApps:最多同时运行的应用程序数目。通过限制该数目,可防止超量Map Task同时运行时产生的中间输出结果撑爆磁盘。 (4) minSharePreemptionTimeout:最小共享量抢占时间。如果一个资源池在该时间内使用的资源量一直低于最小资源量,则开始抢占资源。 (5) schedulingMode/schedulingPolicy:队列采用的调度模式,可以是fifo、fair或者drf。 (6) aclSubmitApps:可向队列中提交应用程序的 Linux 用户或用户组列表,默认情况下为“*”,表示任何用户均可以向该队列提交应用程序。需要注意的是,该属性具有继承性,即子队列的列表会继承父队列的列表。配置该属性时,用户之间或用户组之间用“,”分割,用户和用户组之间用空格分割,比如“user1, user2 group1,group2”。 (7) aclAdministerApps:该队列的管理员列表。一个队列的管理员可管理该队列中的资源和应用程序,比如可杀死任意应用程序。管理员也可为单个用户添加maxRunningJobs属性限制其最多同时运行的应用程序数目。此外,管理员也可通过以下参数设置以上属性的默认值: (8) userMaxJobsDefault:用户的maxRunningJobs属性的默认值。 (9) defaultMinSharePreemptionTimeout :队列的minSharePreemptionTimeout属性的默认值。 (10) defaultPoolSchedulingMode:队列的schedulingMode属性的默认值。 (11) fairSharePreemptionTimeout:公平共享量抢占时间。如果一个资源池在该时间内使用资源量一直低于公平共享量的一半,则开始抢占资源。 复制代码
1.1 yarn-site.xml配置
<?xml version="1.0"?> <!-- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. See accompanying LICENSE file. --> <configuration> <!-- Site specific YARN configuration properties --> <property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value> </property> <property> <name>yarn.scheduler.fair.allocation.file</name> <value>/usr/local/soft/cdh_support/hadoop-2.6.0-cdh5.9.3/etc/hadoop/fair-scheduler.xml</value> </property> <property> <name>yarn.scheduler.fair.preemption</name> <value>true</value> </property> <property> <name>yarn.scheduler.fair.user-as-default-queue</name> <value>false</value> <description>default is True</description> </property> <property> <name>yarn.scheduler.fair.allow-undeclared-pools</name> <value>false</value> <description>default is True</description> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.shuffleHandler</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>Master:8025</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>Master:8030</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>Master:8050</value> </property> <property> <name>yarn.nodemanager.pmem-check-enabled</name> <value>false</value> </property> <property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>30720</value> </property> <property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>1024</value> </property> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>30</value> </property> <property> <name>yarn.scheduler.minimum-allocation-vcores</name> <value>1</value> </property> <property> <name>yarn.scheduler.maximum-allocation-vcores</name> <value>10</value> </property> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>30</value> </property> <property> <name>yarn.nodemanager.vmem-pmem-ratio</name> <value>1</value> </property> <property> <name>hadoop.proxyuser.admin.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.admin.groups</name> <value>*</value> </property> </configuration> 复制代码
1.2 fair-allocation.xml详细配置
-
总资源为60G内存,60个核数
<?xml version="1.0"?> <allocations> <queue name="root"> <minResources>1024mb,2vcores</minResources> <maxResources>30920mb,30vcores</maxResources> <maxRunningApps>50</maxRunningApps> <weight>2.0</weight> <schedulingMode>fair</schedulingMode> <aclSubmitApps> </aclSubmitApps> <aclAdministerApps> </aclAdministerApps> <queue name="queue1"> <minResources>1024mb,2vcores</minResources> <maxResources>10240mb,10vcores</maxResources> <maxRunningApps>50</maxRunningApps> <weight>2.0</weight> <schedulingMode>fair</schedulingMode> <aclAdministerApps>admin</aclAdministerApps> <aclSubmitApps>admin</aclSubmitApps> </queue> <queue name="queue2"> <minResources>1024mb,2vcores</minResources> <maxResources>20480mb,20vcores</maxResources> <maxRunningApps>50</maxRunningApps> <weight>2.0</weight> <schedulingMode>fair</schedulingMode> <aclAdministerApps>admin</aclAdministerApps> <aclSubmitApps>admin</aclSubmitApps> </queue> </queue> </allocations> 复制代码
1.3 配置效果展示(保证每一个应用都能够抢占运行,但是资源不够时,以最低资源启动)
-
资源申请(默认超出队列的任务只能有一个可以向外队列去借用资源)
spark-shell --master yarn --executor-memory 1024m --num-executors 4 --executor-cores 1 --queue queue2 spark-shell --master yarn --executor-memory 1024m --num-executors 4 --executor-cores 1 --queue queue2 spark-shell --master yarn --executor-memory 1024m --num-executors 3 --executor-cores 4 --queue queue2 spark-shell --master yarn --executor-memory 1024m --num-executors 3 --executor-cores 4 --queue queue2 复制代码
-
资源申请一览
- 超出Max Resources 将进行挂起,等待资源释放
- 释放application_1545457701602_0008,观测变化(不满足资源的任务会按照时间先后增加资源)
- 释放application_1545457701602_0009
- 释放application_1545457701602_0010
- 重新申请任务(主要受到核数的影响,新申请任务得不到内存资源)
- 释放application_1545457701602_0012(占用9核,新申请任务得到申请的所有资源)
2 容量调度(实际配置,不够用时最多抢占其他队列的应用只有一个)
Capacity 调度器允许多个组织共享整个集群,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。除此之外,队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度是采用的是先进先出(FIFO)策略。
通过上面那幅图,我们已经知道一个job可能使用不了整个队列的资源。然而如果这个队列中运行多个job,如果这个队列的资源够用,那么就分配给这些job,如果这个队列的资源不够用了呢?其实Capacity调度器仍可能分配额外的资源给这个队列,这就是“弹性队列”(queue elasticity)的概念。
在正常的操作中,Capacity调度器不会强制释放Container,当一个队列资源不够用时,这个队列只能获得其它队列释放后的Container资源。当然,我们可以为队列设置一个最大资源使用量,以免这个队列过多的占用空闲资源,导致其它队列无法使用这些空闲资源,这就是”弹性队列”需要权衡的地方
capacity-scheduler.xml配置
<configuration> <!-- Site specific YARN configuration properties --> <property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value> </property> <property> <name>yarn.scheduler.fair.allocation.file</name> <value>/usr/local/soft/cdh_support/hadoop-2.6.0-cdh5.9.3/etc/hadoop/capacity-scheduler.xml</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.shuffleHandler</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>Master:8025</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>Master:8030</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>Master:8050</value> </property> <property> <name>yarn.nodemanager.pmem-check-enabled</name> <value>false</value> </property> <property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>30720</value> </property> <property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>1024</value> </property> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>30</value> </property> <property> <name>yarn.scheduler.minimum-allocation-vcores</name> <value>1</value> </property> <property> <name>yarn.scheduler.maximum-allocation-vcores</name> <value>10</value> </property> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>10</value> </property> <property> <name>yarn.nodemanager.vmem-pmem-ratio</name> <value>1</value> </property> <property> <name>hadoop.proxyuser.admin.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.admin.groups</name> <value>*</value> </property> </configuration> 复制代码
yarn-site.xml配置
-
详细配置
<property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value> </property> <property> <name>yarn.scheduler.fair.allocation.file</name> <value>/usr/local/soft/cdh_support/hadoop-2.6.0-cdh5.9.3/etc/hadoop/capacity-scheduler.xml</value> </property> 复制代码
-
案例测试
spark-shell --master yarn --executor-memory 1024m --num-executors 3 --executor-cores 4 --queue yq 复制代码
-
版权声明:本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。QQ邮箱地址:1120746959@qq.com,如有任何技术交流,可随时联系。
-
参考文档
http://www.cnblogs.com/xiaodf/p/6266201.html https://blog.csdn.net/qq_36753550/article/details/83065546 https://blog.csdn.net/dxl342/article/details/52840455 http://www.cnblogs.com/xiaodf/p/6266201.html 复制代码
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Kubernetes 1.12.3 发布,容器调度管理工具
- Kubernetes 1.12.3 发布,容器调度管理工具
- 理解golang调度之一 :操作系统调度
- 理解golang调度之二 :Go调度器
- Golang 源码学习调度逻辑(三):工作线程的执行流程与调度循环
- Node.js CPU调度优化(多服务器多核心分配调度)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。