跳到主要内容

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>

picture 2

picture 0

[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

picture 1

结论: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

picture 3

测试在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