【大数据】HADOOP-YARN容量调度器多队列配置详解实战

news2024/11/18 3:46:19

简介

Capacity调度器具有以下的几个特性:

  • 层次化的队列设计,这种层次化的队列设计保证了子队列可以使用父队列设置的全部资源。这样通过层次化的管理,更容易合理分配和限制资源的使用。
  • 容量保证,队列上都会设置一个资源的占比,这样可以保证每个队列都不会占用整个集群的资源。
    安全,每个队列有严格的访问控制。用户只能向自己的队列里面提交任务,而且不能修改或者访问其他队列的任务。
  • 弹性分配,空闲的资源可以被分配给任何队列。当多个队列出现争用的时候,则会按照比例进行平衡。
    多租户租用,通过队列的容量限制,多个用户就可以共享同一个集群,同时保证每个队列分配到自己的容量,提高利用率。
  • 操作性,yarn支持动态修改调整容量、权限等的分配,可以在运行时直接修改。还提供给管理员界面,来显示当前的队列状况。管理员可以在运行时,添加一个队列;但是不能删除一个队列。管理员还可以在运行时暂停某个队列,这样可以保证当前的队列在执行过程中,集群不会接收其他的任务。如果一个队列被设置成了stopped,那么就不能向他或者子队列上提交任务了。
  • 基于资源的调度,协调不同资源需求的应用程序,比如内存、CPU、磁盘等等。

需求

default 队列占总内存的40%,最大资源容量占总资源的60%
ops 队列占总内存的60%,最大资源容量占总资源的80%

配置队列优先级策略

配置多队列的容量调度器

  1. 在yarn-site.xml里面配置使用容量调度器
<!-- 使用容量调度器 -->
<property>
    <name>yarn.resourcemanager.scheduler.class</name>   
    <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
  1. 在capacity-scheduler.xml中配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <!-- 表示集群最大app数 -->
  <property>
    <name>yarn.scheduler.capacity.maximum-applications</name>
    <value>10000</value>
  </property>
  <!-- 表示集群上某队列可使用的资源比例 目的是为了限制过多的am数,即app数 -->
  <property>
    <name>yarn.scheduler.capacity.maximum-am-resource-percent</name>
    <value>0.1</value>
  </property>
  <!-- 配置指定调度器使用的资源计算器 -->
  <!-- DefaultResourseCalculator 默认值,只使用内存进行比较 -->
  <!-- DominantResourceCalculator 多维度资源计算,内存、cpu -->
  <property>
    <name>yarn.scheduler.capacity.resource-calculator</name>
    <value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value>
  </property>
  <!-- root队列中有哪些子队列-->
  <property>
    <name>yarn.scheduler.capacity.root.queues</name>
    <value>default,ops</value>
  </property>

  <!-- *******************default队列*********************** -->
  <!-- default 队列占用的资源容量百分比 40% -->
  <property>
    <name>yarn.scheduler.capacity.root.default.capacity</name>
    <value>40</value>
  </property>
  <!-- default 队列占用的最大资源容量百分比 60%-->
  <property>
    <name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
    <value>60</value>
  </property>
  <!-- 允许单个用户最多可获取的队列资源的倍数,默认值1,
       确保单个用户无论集群有多空闲,永远不会占用超过队列配置的资源
       当值大于1时,用户可使用的资源将超过队列配置的资源,
       但应该不能超过队列配置的最大资源
  -->
  <property>
    <name>yarn.scheduler.capacity.root.default.user-limit-factor</name>
    <value>1</value>
  </property>
  <!-- 队列状态 -->
  <property>
    <name>yarn.scheduler.capacity.root.default.state</name>
    <value>RUNNING</value>
  </property>
  <!-- 限定哪些admin用户可向root队列中提交应用程序 -->
  <property>
    <name>yarn.scheduler.capacity.root.default.acl_submit_applications</name>
    <value>*</value>
  </property>
  <!-- 为root队列指定一个管理员,该管理员可控制该队列的所有应用程序,比如杀死任意一个应用程序等 -->
  <property>
    <name>yarn.scheduler.capacity.root.default.acl_administer_queue</name>
    <value>*</value>
  </property>
  <!-- 配置哪些用户有权配置提交任务优先级 -->
  <property>
    <name>yarn.scheduler.capacity.root.default.acl_application_max_priority</name>
    <value>*</value>
  </property>
  <!-- 任务的超时时间设置:yarn application -appId ${appId} -updateLifeTime Timeout -->
  <!-- 如果application指定了超时时间,则提交到该队列的application能够制定的最大超时时间不能超过该值。-->
  <property>
    <name>yarn.scheduler.capacity.root.default.maximum-application-lifetime</name>
    <value>-1</value>
  </property>
  <!-- 如果application没有指定超时时间,则用default-application-lifetime 作为默认值 -->
  <property>
    <name>yarn.scheduler.capacity.root.default.default-application-lifetime</name>
    <value>-1</value>
  </property>

  <!-- *******************hive队列*********************** -->
  <!-- hive 队列占用的资源容量百分比 60% -->
  <property>
    <name>yarn.scheduler.capacity.root.ops.capacity</name>
    <value>60</value>
  </property>
  <!-- default 队列占用的最大资源容量百分比 80%-->
  <property>
    <name>yarn.scheduler.capacity.root.ops.maximum-capacity</name>
    <value>80</value>
  </property>
  <!-- 允许单个用户最多可获取的队列资源的倍数,默认值1,
              确保单个用户无论集群有多空闲,永远不会占用超过队列配置的资源
       当值大于1时,用户可使用的资源将超过队列配置的资源,
       但应该不能超过队列配置的最大资源
  -->
  <property>
    <name>yarn.scheduler.capacity.root.ops.user-limit-factor</name>
    <value>1</value>
  </property>
  <!-- 队列状态 -->
  <property>
    <name>yarn.scheduler.capacity.root.ops.state</name>
    <value>RUNNING</value>
  </property>
  <!-- 限定哪些admin用户可向root队列中提交应用程序 -->
  <property>
    <name>yarn.scheduler.capacity.root.ops.acl_submit_applications</name>
    <value>*</value>
  </property>
  <!-- 为root队列指定一个管理员,该管理员可控制该队列的所有应用程序,比如杀死任意一个应用程序等 -->
  <property>
    <name>yarn.scheduler.capacity.root.ops.acl_administer_queue</name>
    <value>*</value>
  </property>
  <!-- 配置哪些用户有权配置提交任务优先级 -->
  <property>
    <name>yarn.scheduler.capacity.root.ops.acl_application_max_priority</name>
    <value>*</value>
  </property>
   <!-- 任务的超时时间设置:yarn application -appId ${appId} -updateLifeTime Timeout -->
  <!-- 如果application指定了超时时间,则提交到该队列的application能够制定的最大超时时间不能超过该值。-->
  <property>
    <name>yarn.scheduler.capacity.root.ops.maximum-application-lifetime</name>
    <value>-1</value>
  </property>
  <!-- 如果application没有指定超时时间,则用default-application-lifetime 作为默认值 -->
  <property>
    <name>yarn.scheduler.capacity.root.opsdefault-application-lifetime</name>
    <value>-1</value>
  </property>
  <!--
      CapacityScheduler尝试调度机本地容器之后错过的调度机会数。
      通常,应该将其设置为集群中的节点数。
      默认情况下在一个架构中设置大约40个节点。应为正整数值。
  -->
  <property>
    <name>yarn.scheduler.capacity.node-locality-delay</name>
    <value>40</value>
  </property>
  <!--
    在节点本地延迟时间之外的另外的错过的调度机会的次数,在此之后,
    CapacityScheduler尝试调度非切换容器而不是机架本地容器.例如:在node-locality-delay = 40和rack-locality-delay = 20的情况下,
    调度器将在40次错过机会之后尝试机架本地分配,在40 + 20 = 60之后错过机会.使用-1作为默认值,禁用此功能.
    在这种情况下,根据资源请求中指定的容器和唯一位置的数量以及集群的大小,计算分配关闭交换容器的错失机会的数量
  -->
  <property>
    <name>yarn.scheduler.capacity.rack-locality-additional-delay</name>
    <value>-1</value>
  </property>
  <!-- 此配置指定用户或组到特定队列的映射 -->
  <property>
    <name>yarn.scheduler.capacity.queue-mappings</name>
    <value>u:root:default,g:root:default,u:%user:%user</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.queue-mappings-override.enable</name>
    <value>false</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.per-node-heartbeat.maximum-offswitch-assignments</name>
    <value>1</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.application.fail-fast</name>
    <value>false</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.workflow-priority-mappings</name>
    <value></value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.workflow-priority-mappings-override.enable</name>
    <value>false</value>
  </property>
</configuration>
  1. 同步到其他节点后,刷新配置
bin/yarn rmadmin -refreshQueues
  1. 查看界面展示
    在这里插入图片描述
  2. 提交任务,查看队列资源占比情况
    提交任务
bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --driver-memory 2g --executor-memory 2g --executor-cores 1 --num-executors 1 --queue default examples/jars/spark-examples_2.12-3.2.1.jar 100

–driver-memory 2g --executor-memory 2g --executor-cores 1 --num-executors 1
在这里插入图片描述
在这里插入图片描述
可以看到 向YARN的资源需求是:
amMemory = 2048
amMemoryOverhead = 384

executorMemory = 2048
executorOffHeapMemory. = 0
executorMemoryOverhead = 384

amCores = 1

最终向YARN上申请AM的资源大小为:

am = amMemory + amMemoryOverhead = 2432
executor = executorMemory + executorMemoryOverhead = 2432

capability = <memory:2432,vCores:1>
由于配置的集群资源分配最小单位为1024MB, 因此需要向上取整, 即 3072 MB

这也是为甚么我明明申请的 资源 比较小,但是在yarn上显示的资源总不对,比实际申请的资源要高一些。资源比预期的要高。

这主要是yarn的资源计算是用DominantResourceCalculator来计算管理 cpu、内存的。

spark和yarn上申请的资源没有对的上。

所以最终的资源:
Driver 申请的资源 --driver-memory 2g 实际在yarn中AM申请的资源为 3g1c
Executor 申请的资源 --executor-memory 2g --executor-cores 1 --num-executors 1 实际在yarn中executor申请的资源为 3g1c

最终总的资源为 6g2c

在这里插入图片描述

同理再提交一下 1g1c的

bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --driver-memory 1g --executor-memory 1g --executor-cores 1 --num-executors 2 --queue default examples/jars/spark-examples_2.12-3.2.1.jar 100

–driver-memory 1g --executor-memory 1g --executor-cores 1 --num-executors 2

在这里插入图片描述
所以最终的资源:

Driver 申请的资源 --driver-memory 1g 实际在yarn中AM申请的资源为 1g1c
Executor 申请的资源 --executor-memory 1g --executor-cores 1 --num-executors 2 实际在yarn中executor申请的资源为 4g2c

最终总的资源为 6g3c

  1. 验证队列的最大资源限制
bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --driver-memory 2g --executor-memory 2g --executor-cores 2 --num-executors 5 --queue default examples/jars/spark-examples_2.12-3.2.1.jar 100

在这里插入图片描述
当内存需求超过队列最大资源时

bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --driver-memory 2g --executor-memory 2g --executor-cores 2 --num-executors 6 --queue default examples/jars/spark-examples_2.12-3.2.1.jar 100

在这里插入图片描述

在这里插入图片描述
最终看到申请的资源可以超过队列配置的资源,但是不会超过最大的资源

spark申请的容器为 6 个,但是最终只启动了4个。

希望对正在查看文章的您有所帮助,记得关注、评论、收藏,谢谢您

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/349939.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据分析与SAS学习笔记4

INPUT语句&#xff1a;格式修饰符&#xff1a; “:” 修饰符。表示从下一个非空格列读入数据&#xff0c;直到:1 遇到再下一个空格列&#xff1b; 2 读到预先定义的变量长度&#xff1b; 3 数据行结束。哪个先出现就在哪儿结束。 “&” 修饰符。表示从下一个非空格列读入…

分享我从功能测试转型到测试开发的真实故事

由于这段时间我面试了很多家公司&#xff0c;也经历了之前公司的不愉快。所以我想写一篇文章来分享一下自己的面试体会。希望能对我在之后的工作或者面试中有一些帮助&#xff0c;也希望能帮助到正在找工作的你。 找工作 我们总是草率地进入一个自己不了解的公司工作&#xf…

【C语言】web后端 CGI

web后端 CGI 一、cgi的学习 cgi通用网关接口 是web服务器主机提供信息服务的标准接口。通过CGI接口&#xff0c;web服务器就能获取客户端提交的信息&#xff0c;转交给服务器端端CGI程序进行处理&#xff0c;最后返回结果给客户端。 服务器和CGI程序之间通过 stdin/stdout 标准…

Python学习-----函数3.0(嵌套函数、闭包、装饰器)

目录 1.函数嵌套 2.闭包 3.装饰器 这一节&#xff0c;我会详细Python中讲解函数的进阶内容&#xff0c;包括嵌套函数、闭包和装饰器。一起来学习吧&#xff01;&#xff01;&#xff01; 1.函数嵌套 概念&#xff1a;函数里面再定义一个函数 作用&#xff1a;当我们在一个多…

Jenkins 基于Kubernetes 弹性构建池

流程&#xff1a;创建Jenkins Agent&#xff1b;获取Jenkins Agent的参数&#xff1b;渲染yaml模板&#xff1b;调用K8s API在固定的NS中创建一个Pod&#xff1b;运行Jenkins pipeline到agent&#xff1b;创建Agentimport hudson.model.Node.Mode import hudson.slaves.* impor…

学Python不会不知道NumPy计算包吧,带你五分钟看懂NumPy计算包

从今天我们就开始进入 Python 数据分析工具的教程。 前段时间数据分析和Python都讲了一点点&#xff0c;但是Python的数据库&#xff0c;讲的少了点&#xff0c;所以接下来就讲讲这些重要的常用数据库吧&#xff01;&#xff01;&#xff01; Python 数据分析绝对绕不过的四个…

数据库常用命令

文章目录1. 数据库操作命令1.进入数据库2.查看数据库列表信息3.查看数据库中的数据表信息2.SQL语句命令1. 创建数据表2. 基本查询语句3. SQL排序4. SQL分组统计5. 分页查询6. 多表查询7.自关联查询8.子查询1. 数据库操作命令 1.进入数据库 mysql -uroot -p2.查看数据库列表信…

PDF怎么转换成Word?两种PDF免费转Word方法推荐

不知道你们有没有发现&#xff0c;我们在网上下载的很多资料都是PDF格式的&#xff0c;尽管PDF文件也可以通过专门的PDF编辑器来编辑&#xff0c;但是PDF文档作为版式文档&#xff0c;编辑起来还是存在很多局限性&#xff0c;所有当我们需要大量编辑修改文档的时候&#xff0c;…

网络编程套接字之TCP

文章目录一、TCP流套接字编程ServerSocketSocketTCP长短连接二、TCP回显服务器客户端服务器客户端并发服务器UDP与TCP一、TCP流套接字编程 我们来一起学习一下TCP socket api的使用&#xff0c;这个api与我们之前学习的IO流操作紧密相关&#xff0c;如果对IO流还不太熟悉的&am…

Springboot 我随手封装了一个万能的导出excel工具,传什么都能导出

前言 如题&#xff0c;这个小玩意&#xff0c;就是不限制你查的是哪张表&#xff0c;用的是什么类。 我直接一把梭&#xff0c;嘎嘎给你一顿导出。 我知道&#xff0c;这是很多人都想过的&#xff0c; 至少我就收到很多人问过我这个类似的问题。 我也跟他们说了&#xff0c;但…

python冒号的用法总结

一维数组 1. 单个冒号的情况 1.1 写完整的情况下 单个冒号的情况下&#xff0c;对数组的遍历操作是从前向后操作。如&#xff1a;arr[a:b] &#xff0c;冒号前的a含义是从a开始遍历&#xff0c;冒号后的b含义是到b截止&#xff08;不包括b&#xff09;。 arr [1, 2, 3, 4,…

Qt扫盲-QMake 语言概述

QMake 语言概述一、概述二、变量三、替换函数四、测试函数一、概述 这里主要就是记录一下如何使用 qmake Manual&#xff0c;里面关于我对 qmake的理解&#xff0c;以及如何配置这个 qt 工程文件&#xff0c;通过配置工程文件&#xff0c;来构建出&#xff0c;APP&#xff0c;…

如何在Github上配置ssh key的密钥

Step0 : 解释说明 git使用SSH配置&#xff0c; 初始需要以下三个步骤 使用秘钥生成工具生成rsa秘钥和公钥将rsa公钥添加到代码托管平台将rsa秘钥添加到ssh-agent中&#xff0c;为ssh client指定使用的秘钥文件 Step 1: 核验本地主机是否已经存在ssh密钥。&#xff08;若id_rs…

ChatGPT之文章生成

文章目录介绍激励设计Prompt Design故障调整Troubleshooting分类Classification提高分类器的效率生成对话内容转化翻译转化总结实际问答插入文本编辑模式介绍 ChatGPT功能很强大&#xff0c;它可以根据你给出的模板和文本进行文本补全&#xff0c;最好的探索方式就是使用我们给…

数据预处理(无量纲化、缺失值、分类特征、连续特征)

文章目录1. 无量纲化1.1 sklearn.preprocessing.MinMaxScaler1.2 sklearn.preprocessing.StandardScaler2. 缺失值3. 分类型特征4. 连续型特征数据挖掘的五大流程包括&#xff1a;获取数据数据预处理特征工程建模上线 其中&#xff0c;数据预处理中常用的方法包括数据标准化和归…

3分钟学会图新地球图源制作详细教程

图新地球图源制作 1.资源准备 &#xff08;1&#xff09; 准备一份图新地球支持的lrc格式的图源; &#xff08;2&#xff09; 安装图新地球 &#xff08;LSV&#xff09;软件和奥维omap软件 。 2.操作步骤 (1) 用记事本打开lrc格式的文件(图①)&#xff0c;同时用奥维软件…

Unity 多语言 轻量高效的多语言工具集 LanguageManager

效果展示 支持excel导入自动化 组件化 更方便 也提供直接获取多语言的接口 没有挂 LanguageText的对象也可以获取多语言文本内容 支持 Format接口 可以传递N个参数进来组装多语言 支持首次系统语言自测 支持语言切换后本地自动保存配置 支持实时切换 同步刷新所有UI 容错处…

Maven:在Intellij idea的使用

MavenIntellij idea配置MavenIntellij idea创建Maven项目Java项目的创建Web项目的创建Intellij idea执行Maven命令JavaWeb项目转为Maven项目遇到的问题解决了解到Maven的基础知识后&#xff0c;接下来&#xff0c;简单介绍Maven在Intellij idea的使用&#xff08; 以 IntelliJ …

在线开会,来开开圆桌会议吧~

圆桌会议应用场景&#xff1a;适合内部培训、部门会议亦或是头脑风暴等较为轻松的场景&#xff0c;有兴趣的朋友可以联系我来测试哦~~ 上图&#xff1a; 图&#xff1a;圆桌会议应用截图 在圆桌布局之下&#xff0c;企业可以将每一位参会者和座位绑定&#xff0c;1:1模拟线下圆…

微信中如何接入机器人才比较安全(不会收到警告或者f号)之第三步正式接入

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 前言 前面两篇文章分别介绍了下chatgpt接入方式: 微信中如何接入chatgpt机器人才比较安全(不会收到警告或者f号)之第一步登录微信 微信中如何接入chatgpt机器人才比较安全(不会收到警告或者f号)之第二步注入dll文件…