前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >yarn节点属性及调度

yarn节点属性及调度

作者头像
陈猿解码
发布于 2023-02-28 07:06:14
发布于 2023-02-28 07:06:14
1.1K00
代码可运行
举报
文章被收录于专栏:陈猿解码陈猿解码
运行总次数:0
代码可运行

【节点属性产生的背景】


在2.X版本中,已经支持节点设置标签,并且允许容量调度中的队列,设置可访问的节点标签以及默认标签值,并按照节点标签进行调度。

但一个节点只能有1个标签,这样在yarn集群中,通过标签将NM节点划分为不同的节点池(1个NM节点只能属于某个固定的节点池)。

实际上,光有节点标签还不能满足一些复杂的场景,比如同一个类型标签中的不同NM节点,可能有不同环境信息,例如不同的jdk版本、python版本、cpu型号等等。

实际任务调度时,需要在正确的节点上运行,因此引入了节点属性,节点属性按K=V的形式设置,并且允许设置多个。

【节点属性的配置与设置】


1. yarn配置

和节点标签一样,节点属性并不是默认开启的,需要在rm(yarn-site.xml)中进行如下配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<property>
  <name>yarn.node-attribute.fs-store.root-dir</name>
  <value>hdfs://hdfsHACluster/root/node-attributes/</value>
</property>

<property>
  <name>yarn.node-attirbute.fs-store.impl.class</name>
  <value>FileSystemNodeAttributeStore</value>
</property>

其中"yarn.node-attribute.fs-store.root-dir"表示节点属性在RM中的存储位置,可以选择存储本地(对应配置为file:///xxx/xxx),也可以是选择存储在hdfs上。

"yarn.node-attirbute.fs-store.impl.class"表示节点属性存储的实现类,默认为`FileSystemNodeAttributeStore`。

2. 节点属性的设置

完成配置后,接下来自然就是对节点设置属性。设置属性的方式也和节点标签类似,分为中心集中式和分布式,简单来说中心集中式就是通过(管理员用户)执行命令对各节点进行属性设置;分布式则是由各节点通过自身配置的方式向RM上报所拥有的属性。

对于中心集中式,主要使用添加、删除命令,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 为指定节点添加属性
yarn nodeattributes -add "172.168.3.51:python2=true"
# 删除指定节点的属性
yarn nodeattributes -remove "172.168.3.51:python2=true"

添加或删除命令,通过指定节点的IP或域名,然后以":"分隔指定一个或多个属性,属性之间以","分隔;如果需要同时为多个节点设置属性,以空格为分隔符,分别指定为不同节点指定属性。

对于分布式,则需要在NM中进行对应的配置,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- 配置为config时通过 yarn.nodemanager.node-attributes.provider.configured-node-attributes来指定节点属性 -->
<property>
    <name>yarn.nodemanager.node-attributes.provider</name>
    <value>config</value>
</property>
<property>
    <name>yarn.nodemanager.node-attributes.provider.configured-node-attributes</name>
    <!-- 多个属性以 ":" 进行分隔 -->
    <!-- 每个属性必须包含3个字段, 属性名,类型,属性值, 字段之间以","作为分隔 -->
    <!-- 类型只能为大写STRIGN -->
    <!-- 属性名只能为{0-9, a-z, A-Z, -, _} 且不能超过255个字符 -->
    <value>jdk8,STRING,true:python3,STRING,true</value>
</property>

"yarn.nodemanager.node-attributes.provider"除了配置为config外,还可以配置为script,即通过定期执行指定的脚本来设置节点的属性,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<property>
    <name>yarn.nodemanager.node-attributes.provider</name>
    <value>script</value>
</property>
<!--脚本的路径-->
<!--脚本的输出必须为一行或多行这样的信息 NODE_ATTRIBUTE:属性名,类型,属性值" -->
<property>
    <name>yarn.nodemanager.node-attributes.provider.script.path</name>
    <value>/opt/xxx.sh</value>
</property>
<!--脚本附带的参数-->
<property>
    <name>yarn.nodemanager.node-attributes.provider.script.opts</name>
    <value></value>
</property>
<!--脚本执行的间隔-->
<property>
    <name>yarn.nodemanager.node-attributes.provider.fetch-interval-ms</name>
    <value>600000</value>
</property>
<!--脚本执行的超时时间-->
<property>
    <name>yarn.nodemanager.node-attributes.provider.fetch-timeout-ms</name>
    <value>1200000</value>
</property>

除此之外,还可以配置自定义开发的实现类,该实现类一定要继承自"org.apache.hadoop.yarn.server.nodemanager.nodelabels.NodeAttributesProvider"。

完成节点的属性设置后,可以通过下面的命令来查看已经设置的节点属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@rm-0 /]# yarn nodeattributes -attributestonodes
                                Hostname Attribute-value
nm.yarn.io/python3 :
                            172.168.3.51 true
rm.yarn.io/python2 :
                            172.168.3.51 true
nm.yarn.io/jdk8 :
                            172.168.3.51 true

对于节点属性的设置,有如下需要注意的地方:

  • 同一个key不能赋多个值,也就是说,对同一个Key多次设置属性值,后面设置的值覆盖前面设置的值。
  • 当前value的类型仅支持string
  • 节点标签还需要在队列中设置可以访问的标签,而节点属性则完全与队列没有关系。
  • 对于节点标签而言,只能采用集中式或者分布式的方式,而节点属性则可以同时使用集中式和分布式的方式对接点进行设置。对于集中式设置的属性,会添加"rm.yarn.io"前缀,而对于分布式方式设置的属性,会添加"nm.yarn.io"前缀。这就意味着属性是通过前缀加名称来唯一标识的。

【按节点属性进行任务调度】


1. Placement Constraints简介

任务的container能根据节点属性来进行调度,本质上是用到了Placement Constraints,这里先来简单介绍下Placement Constraints。

很多时候,为了提升性能,需要让同一个application中的多个任务container运行在指定节点上,比如为了避免网络带宽带来的损耗,让container之间具备亲和性(运行在同一节点上)。

或者考虑到hdfs读写的性能,将应用的所有任务container调度到指定的节点上等等。

Hadoop引入了placement constraint,即AM向RM注册时,可以设置不同的表达式,后续申请资源时,让yarn根据此表达式来进行精准调度。

这个表达式就包含了NM节点属性,因此就可以按照NM节点属性来正确调度,当然,不仅限于按节点属性来调度。

2. 按节点属性匹配调度

要开启placement的匹配调度,首先需要在RM中进行如下配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<property>
    <name>yarn.resourcemanager.placement-constraints.handler</name>
    <value>placement-processor</value>
</property>

然后,可以通过自带的命令可以进行测试验证:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yarn org.apache.hadoop.yarn.applications.distributedshell.Client -jar share/hadoop/yarn/hadoop-yarn-applications-distributedshell-3.3.3.jar -shell_command sleep -shell_args 10 -num_containers 3 -placement_spec python2=true

任务的执行情况:

对比下同样的任务,未指定任何节点属性的情况:

同样,在使用中有如下需要注意的地方:

  • 属性名称的指定

对于通过集中式方式指定的属性,可以不用加前缀,直接使用其属性名即可,而对于分布式(NM自行上报)的属性,使用时需要增加前缀才能正确进行匹配上。因此使用上建议统一方式。

  • placement constraint为硬限制

节点属性约束是硬限制的, 即只有当节点的属性与任务指定的属性匹配时才能进行分配,否则任务container会一直处于pending状态,直到找到可以满足条件的有效节点。

  • 作用于任务container

从上面的使用方式可以看到,placement constraint是在AM中进行设置的,因此也就只对任务container生效,而AM本身还是由RM按原有的方式进行调度。

  • flink/spark还未支持

当前最新版本的flink与spark都还未支持设置该参数,如需要使用,需要自行修改代码支持。

  • 参数不是强制的

为任务contaienr申请资源时,placement表达式不是必须的,客户端接口中有两个接口分别对应携带和不带该参数的情况。

【总结】


本文简单介绍了节点属性的背景,如何进行配置,以及如何按照节点属性进行任务的调度。当然,涉及的placement constraint是一个比较庞大的内容,包括详细的表达式设置、AM的代码中应当如何编写对应的代码、RM中的调度逻辑等等,这里没有展开讲解,后面单独来进行整理说明。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 陈猿解码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
高频js笔试题看这一篇就够了
类的继承在几年前是重点内容,有n种继承方式各有优劣,es6普及后越来越不重要,那么多种写法有点『回字有四样写法』的意思,如果还想深入理解的去看红宝书即可,我们目前只实现一种最理想的继承方式。
helloworld1024
2022/11/04
7640
由浅入深,66条JavaScript面试知识点
来源:https://juejin.im/post/5ef8377f6fb9a07e693a6061
zz_jesse
2020/07/07
1K0
由浅入深,66条JavaScript面试知识点
利用这 66 条 JS 知识抓住年底最后一次跳槽涨薪的机会
作者: Jake Zhang https://juejin.cn/post/6844904200917221389
用户4456933
2021/06/01
7030
利用这 66 条 JS 知识抓住年底最后一次跳槽涨薪的机会
100道+ JavaScript 面试题,助你查漏补缺
详细资料可以参考: 《JavaScript 有几种类型的值?》 《JavaScript 有几种类型的值?能否画一下它们的内存图;》
前端达人
2020/04/08
9000
JavaScript 面试知识点总结
本部分主要是笔者在复习 JavaScript 相关知识和一些相关面试题时所做的笔记,如果出现错误,希望大家指出!
不愿意做鱼的小鲸鱼
2022/09/24
4080
signature=0fdde99449705347b1bc3148e0519684,yarn.lock · mirrors_yeoman/generator-generator – Gitee.co
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
全栈程序员站长
2022/10/02
4540
入坑!通过ajaxreturn jquery json提交form
\Think\Controller类提供了ajaxReturn方法用于AJAX返回数据给客户端(视图、模板、js等)。并且支持JSON、JSONP、XML和EVAL四种方式给客户端接受数据(默认JSON)。
PM吃瓜
2019/08/12
5K0
入坑!通过ajaxreturn jquery json提交form
前端基础进阶(十七):详解 ES6 Modules
历史上,JavaScript 一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。其他语言都有这项功能,比如 Ruby 的require、Python 的import,甚至就连 CSS 都有@import,但是 JavaScript 任何这方面的支持都没有,这对开发大型的、复杂的项目形成了巨大障碍。
唐志远
2022/10/27
1.2K0
编写可维护的JavaScript
• 在方法中的局部变量(local variable)和第一条语句之间
硬核项目经理
2019/08/07
8640
JQuery-命令速查-CheatSheet
http://stackoverflow.com/questions/31379409/form-submission-causing-maximum-call-stack-size-exceeded
szhshp
2022/09/21
9.8K0
2021前端面试必备题+答案
如果是 HTTP 1.0 版本协议,一般情况下,不支持长连接,因此在每次请求发送完毕之后,TCP 连接即会断开,因此一个 TCP 发送一个 HTTP 请求,但是有一种情况可以将一条 TCP 连接保持在活跃状态,那就是通过 Connection 和 Keep-Alive 首部,在请求头带上 Connection: Keep-Alive,并且可以通过 Keep-Alive 通用首部中指定的,用逗号分隔的选项调节 keep-alive 的行为,如果客户端和服务端都支持,那么其实也可以发送多条,不过此方式也有限制,可以关注《HTTP 权威指南》4.5.5 节对于 Keep-Alive 连接的限制和规则。
zz1998
2021/07/06
8110
Python全栈之jQuery笔记
jQuery runnoob网址: http://www.runoob.com/jquery/jquery-tutorial.html jQuery API手册: http://www.runoob.com/manual/jquery/ jQuery笔记 笔记来源于: 传智播客的黑马程序员视频笔记. 菜鸟教程:http://www.runoob.com/ 自己的查询与整理. JS的不完美地方: 1. 代码比较麻烦,给多个元素添加事件需要遍历,可能还需要进行嵌套.
py3study
2020/01/19
5.5K0
快速学习-综合案例RESTRUL_CRUD
发起请求,无法执行,因为delete请求必须通过post请求转换为delete请求,借助:HiddenHttpMethodFilter过滤器
cwl_java
2020/02/19
1.8K0
快速学习-综合案例RESTRUL_CRUD
前端MVC Vue2学习总结(七)——ES6与Module模块化、Vue-cli脚手架搭建、开发、发布项目与综合示例
使用vue-cli可以规范项目,提高开发效率,但是使用vue-cli时需要一些ECMAScript6的知识,特别是ES6中的模块管理内容,本章先介绍ES6中的基础与模块化的内容再使用vue-cli开发vue项目。 一、ECMAScript6概要 ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,英文名称是European Computer Manufacturers Association)通过ECMA-262标准化的脚本程序设计语言。这种语言在万维网上应用广泛,它往往被称为JavaSc
张果
2018/03/30
1.8K0
前端MVC Vue2学习总结(七)——ES6与Module模块化、Vue-cli脚手架搭建、开发、发布项目与综合示例
从零实现的浏览器Web脚本
在之前我们介绍了从零实现Chrome扩展,而实际上浏览器级别的扩展整体架构非常复杂,尽管当前有统一规范但不同浏览器的具体实现不尽相同,并且成为开发者并上架Chrome应用商店需要支付5$的注册费,如果我们只是希望在Web页面中进行一些轻量级的脚本编写,使用浏览器扩展级别的能力会显得成本略高,所以在本文我们主要探讨浏览器Web级别的轻量级脚本实现。
WindRunnerMax
2023/11/04
8420
一个Angular 5教程:一步一步指导实现你的第一个Angular 5应用程序
现在我们可以app.component.html用这个替换:Angular是由Google开发的AngularJS框架的新版本。它带有一个完整的重写,以及各种改进,包括优化构建和更快的编译时间。在这个Angular 5教程中,我们将从头开始构建一个笔记应用程序。如果您一直在等待学习Angular 5,本教程适合您。
WindCoder
2018/09/19
42.8K0
一个Angular 5教程:一步一步指导实现你的第一个Angular 5应用程序
Airflow速用
Airflow是Apache用python编写的,用到了 flask框架及相关插件,rabbitmq,celery等(windows不兼容);、
用户1558882
2019/10/31
5.5K0
jquery 实现点击图片居住放大缩小
该功能是基于jquery实现的,所以 第一步则是引入jquery jquery下载地址:https://jquery.com/download/ 或者使用此时调试的版本(3版本) /*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ !function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.expo
wfaceboss
2019/04/08
17.3K0
【原创】前端面试知识体系(一)
我的博客来源:https://1024bibi.com/2018/01/01/%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E7%9F%A5%E8%AF%86%E4%BD%93%E7%B3%BB%EF%BC%88%E4%B8%80%EF%BC%89/
达达前端
2023/10/08
2870
2018年最全面的前端面试题都在这里了
意义:根据内容的结构化(内容语义化),选择合适的标签(代码语义化)便于开发者阅读和写出更优雅的代码的同时让浏览器的爬虫和机器很好地解析。 注意: 1.尽可能少的使用无语义的标签div和span; 2.在语义不明显时,既可以使用div或者p时,尽量用p, 因为p在默认情况下有上下间距,对兼容特殊终端有利; 3.不要使用纯样式标签,如:b、font、u等,改用css设置。 4.需要强调的文本,可以包含在strong或者em标签中(浏览器预设样式,能用CSS指定就不用他们),strong默认样式是加粗(不要用b),em是斜体(不用i); 5.使用表格时,标题要用caption,表头用thead,主体部分用tbody包围,尾部用tfoot包围。表头和一般单元格要区分开,表头用th,单元格用td; 6.表单域要用fieldset标签包起来,并用legend标签说明表单的用途; 7.每个input标签对应的说明文本都需要使用label标签,并且通过为input设置id属性,在lable标签中设置for=someld来让说明文本和相对应的input关联起来。
前端达人
2018/10/16
7.6K0
相关推荐
高频js笔试题看这一篇就够了
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文