yarn节点属性及调度
【节点属性产生的背景】
在2.X版本中,已经支持节点设置标签,并且允许容量调度中的队列,设置可访问的节点标签以及默认标签值,并按照节点标签进行调度。
但一个节点只能有1个标签,这样在yarn集群中,通过标签将NM节点划分为不同的节点池(1个NM节点只能属于某个固定的节点池)。
实际上,光有节点标签还不能满足一些复杂的场景,比如同一个类型标签中的不同NM节点,可能有不同环境信息,例如不同的jdk版本、python版本、cpu型号等等。
实际任务调度时,需要在正确的节点上运行,因此引入了节点属性,节点属性按K=V的形式设置,并且允许设置多个。【节点属性的配置与设置】
1. yarn配置
和节点标签一样,节点属性并不是默认开启的,需要在rm(yarn-site.xml)中进行如下配置:
<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上报所拥有的属性。
对于中心集中式,主要使用添加、删除命令,例如:
# 为指定节点添加属性 yarn nodeattributes -add "172.168.3.51:python2=true" # 删除指定节点的属性 yarn nodeattributes -remove "172.168.3.51:python2=true"
添加或删除命令,通过指定节点的IP或域名,然后以":"分隔指定一个或多个属性,属性之间以","分隔;如果需要同时为多个节点设置属性,以空格为分隔符,分别指定为不同节点指定属性。
对于分布式,则需要在NM中进行对应的配置,例如:
<!-- 配置为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,即通过定期执行指定的脚本来设置节点的属性,例如:
<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"。
完成节点的属性设置后,可以通过下面的命令来查看已经设置的节点属性:
[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中进行如下配置:
<property> <name>yarn.resourcemanager.placement-constraints.handler</name> <value>placement-processor</value> </property>
然后,可以通过自带的命令可以进行测试验证:
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中的调度逻辑等等,这里没有展开讲解,后面单独来进行整理说明。
好了,这就是本文的全部内容,如果觉得本文对您有帮助,请多多转发,也欢迎加我微信交流~
本文分享自微信公众号 - hncscwc(gh_383bc7486c1a)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
百炼成钢 —— 声网实时网络的自动运维丨Dev for Dev 专栏
本文为「Dev for Dev 专栏」系列内容,作者为声网大数据算法工程师黄南薰。 01 自动运维介绍 2016 年,Gartner 创新性地提出了 AIOps 的概念<sup>[1]</sup>,开创了人工智能辅助运维决策的新篇章。 AIOps 的全称为 Artificial Intelligence for IT Operations,即为 IT 运维服务的人工智能。传统的运维方式往往依赖数个具备专业知识的运维人员对某个特定场景下的服务进行监控与决策。随着公司体量的成长,业务场景及数量指数型增长,传统运维将面临着决策时间长、决策难度大、人力成本高等问题,一旦出现重大决策失误,就可能造成巨大的商业损失。然而,海量的数据正好是机器学习的擅长领域。 一套成熟的机器学习算法能够从运维操作中积累判断经验,不眠不休地持续对数据进行监控和分析,为运维决策提供有价值的信息。 02 SD-RTN™ 场景下的自动运维 1、场景介绍 SD-RTN™,全称为 Software Defined Real-time Network,是声网专为双向实时音视频互动而设计的软件定义实时网。 ...
- 下一篇
你所需要了解的几种纹理压缩格式原理
本文基于资料收集,概括了几种纹理压缩格式的基本思想,希望对于学习有所帮助。 为什么我们需要纹理压缩格式? 例如R5G6B5、A4R4G4B4、A1R5G5B5、R8G8B8或A8R8G8B8等未经压缩的图片格式,是能够被GPU直接读取的原生纹理格式。但在低端硬件设备或者说移动平台下,有两个问题需要解决。 一个是内存,例如A8R8G8B8格式中一个像素占4字节,如果是512x512分辨率内存就占用512x512x4 B=1048576 B=1 MB,这种内存消耗在低端设备上根本无法接受。 另一个重要的是数据传输时的带宽,带宽是发热的元凶,在渲染3D场景时,会有大量的贴图被传输到GPU,若不限制,总线带宽很快就会成为瓶颈,手机秒变暖手宝,严重的还会影响渲染性能。 因此我们需要一种内存占用既小又能被GPU读取的格式——压缩纹理格式。纹理压缩对应的算法是以某种形式的固定速率有损向量量化(Lossy Vector Quantization)将固定大小的像素块编码进固定大小的字节块中。 有损表示对于渲染来说,有损压缩是可以接受的,一般选择压缩格式时需要在纹理质量和文件大小上寻求一个平衡。 固定速率...
相关文章
文章评论
共有0条评论来说两句吧...