yarn 资源标签化管理
2023-01-04
一般都通过queue队列进行yarn的管理, 没想到yarn竟然还支持标签化资源管理. 主要是对yarn调度的节点打标签, 提交任务的时候可以指定某些标签的节点进行运行. 看客户的一些使用场景, 比内部固定的yarn用法丰富多了.
使用场景:
- 比如一些机器比较新, 某些重要任务可以配置在优秀的机器执行
- 支持动态扩缩容, 某些节点不加入动态扩缩容中, 能够保持yarn任务的稳定.
- 某些部门的任务就固定在某些机器里, 结合队列的配置更加灵活
配置项
- 可以配置某些标签可以被某些yarn队列提交, 这样在提交yarn队列的时候可以指定使用某个标签的资源, 比如`accessible-node-labels``
- 可以设置yarn队列默认使用某些标签, 这样提交yarn队列的时候自动使用某个标签的资源, 比如
default-node-label-expression - 可以配置某些标签的资源为exclusive, 这样不指定标签的队列无法使用这些资源, 当然也可以配置允许被无标签队列共用, 比如
yarn rmadmin -addToClusterNodeLabels "core(exclusive=false),task(exclusive=false)
参考文档-YARN 标签调度实践
https://www.tencentcloud.com/zh/document/product/1026/34569
参考的配置项
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration><property>
<name>yarn.scheduler.capacity.maximum-am-resource-percent</name>
<value>0.8</value>
</property>
<property>
<name>yarn.scheduler.capacity.maximum-applications</name>
<value>1000</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>default,dev,product</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.capacity</name>
<value>20</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.capacity</name>
<value>40</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.product.capacity</name>
<value>40</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.accessible-node-labels.cpu.capacity</name>
<value>100</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.accessible-node-labels.normal.capacity</name>
<value>100</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.accessible-node-labels</name>
<value>*</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.accessible-node-labels.normal.capacity</name>
<value>100</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.product.accessible-node-labels.cpu.capacity</name>
<value>100</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.accessible-node-labels</name>
<value>normal</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.default-node-label-expression</name>
<value>normal</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.product.accessible-node-labels</name>
<value>cpu</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.product.default-node-label-expression</name>
<value>cpu</value>
</property>
<property>
<name>yarn.scheduler.capacity.normal.sharable-partitions</name>
<value>cpu</value>
</property>
<property>
<name>yarn.scheduler.capacity.normal.require-other-partition-resource</name>
<value>true</value>
</property>
<property>
<name>yarn.scheduler.capacity.cpu.sharable-partitions</name>
<value></value>
</property>
<property>
<name>yarn.scheduler.capacity.cpu.require-other-partition-resource</name>
<value>true</value>
</property>
</configuration>
[hadoop@172 hadoop]$ cd /usr/local/service/hadoop
[hadoop@172 hadoop]$ yarn jar ./share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.8.4-tests.jar sleep -Dmapreduce.job.queuename=product -m 32 -mt 1000
结论:product 队列与 cpu 标签存在映射且默认使用的标签为 cpu,提交到 product 队列的任务运行在标记了 cpu 的节点上。
其他文档参考
YARN Node Labels
https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/NodeLabel.html
Yarn标签管理
https://docs.ksyun.com/documents/42893?type=3
yarn application 任务配置tags
yarn任务提交的时候, 除了设置application id, 还可以额外设置application tags.
通过application tags, 可以识别任务的来源, 配置各种额外的信息, 实现整个数据平台体系的联动.
咨询chatgpt得到的使用方法
YARN 应用程序标签(Application Tags)是一种用于对 YARN 应用程序进行分类和标记的机制。通过为应用程序添加标签,可以更方便地对应用程序进行管理和监控。
sparm submit提交时配置
spark-submit \
--class com.example.MySparkApp \
--master yarn \
--deploy-mode cluster \
--conf "spark.yarn.tags=production,analytics" \
my-spark-app.jar
yarn提交任务时配置
yarn application -Dyarn.application.tags=tag1,tag2 ...
yarn application 查看
yarn application -list
测试在spark-submit的时候提交, 可以设置application-name和application tags
--num-executors 10
--executor-cores 2
--executor-memory 2g
--conf spark.task.maxFailures=3
--name ${projctIdent}-gee-test-${workflowName}
-- conf spark.yarn.tags=${projectIdent},${workflowName},gee