在 Hadoop YARN 中,标签(Labels)机制是一种资源管理的特性,它允许你对节点和应用程序进行分类,可以有效地进行资源管理和调度。
- 节点标签(Node Labels):YARN 允许你为集群中的节点定义标签。这些标签可以代表节点的特性,例如硬件配置、操作系统类型等。这使得你可以根据节点的特性将其分为不同的组,以更灵活地管理和调度资源。
- 应用程序标签(Application Labels):除了节点标签,YARN 还支持将标签分配给特定的应用程序。这使得你可以为不同的应用程序定义特定的运行环境或资源要求
接下来,本文会分别从节点标签和应用标签两个方面来演示YARN标签
01: 启用Yarn标签功能
<property>
<name>yarn.node-labels.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.node-labels.fs-store.root-dir</name>
<value>hdfs://hdfs-ha/user/yarn/node-labels</value>
</property>
配置项:
- yarn.node-labels.enabled 表示是否启用标签功能
- yarn.node-labels.fs-store.root-dir表示标签的存储位置 ( 可以是本地文件,也可以是hdfs上的存储路径 )
02: Yarn集群中添加标签
使用命令方式给yarn集群添加标签
yarn rmadmin -addToClusterNodeLabels "az1(exclusive=true)"
yarn rmadmin -addToClusterNodeLabels "az2(exclusive=true)"
# 或者一次性添加两个标签
yarn rmadmin -addToClusterNodeLabels "az1(exclusive=true),az2(exclusive=true)"
## 删除已添加的标签
yarn rmadmin -removeFromClusterNodeLabels az1,az2
## 查看yarn集群已添加的标签
yarn cluster --list-node-labels
- exclusive表示是否独占,当该标签分区下的节点有空闲资源时,是否可以共享给default分区的任务使用。
- true表示独占,即不共享,资源仅分配给具有该标签的任务使用。
- false表示非独占,即可以共享资源给default标签使用。
执行完addToClusterNodeLabels命令之后,查看yarn界面多了两个标签,但是6个节点的资源还在default标签:
03: Namenode节点关联标签
- 使用命令方式节点关联标签:
# 用法示例
yarn rmadmin -replaceLabelsOnNode <"node1[:port]=label1,label2 node2[:port]=label1,label2"> [-failOnUnknownNodes]
# 节点关联标签,hostname拼接写法,节点间空格分割
yarn rmadmin -replaceLabelsOnNode "kmr-fcc5432e-gn-5fcec1c1-core-1-1.ksc.com=az1 kmr-fcc5432e-gn-5fcec1c1-core-1-5.ksc.com=az2"
# 注意只能以kmr-xxx.ksc.com的hostname作为关联,
# 和yarn界面的Nodes显示的hostname保持一致,否则关联无效
- 使用配置方式节点关联标签:
在yarn-site.xml中配置对应NodeManager所属标签
<property>
<name>yarn.node-labels.configuration-type</name>
<value>distributed</value>
</property>
<property>
<name>yarn.nodemanager.node-labels.provider</name>
<value>config</value>
</property>
<property>
<name>yarn.nodemanager.node-labels.provider.configured-node-partition</name>
<value>az1</value>
</property>
在不同NodeManager所属的标签在yarn.nodemanager.node-labels.provider.configured-node-partition配置对应标签名
经过上面配置之后 yarn UI 界面Node_Lables会显示我们刚才所设置的标签名称:
04: 配置队列可访问的标签和容量
配置队列可访问的标签和容量
<!-- default队列 -->
<property>
<name>yarn.scheduler.capacity.root.default.accessible-node-labels</name>
<value>az1,az2</value>
<description>default队列应用可用的节点标签</description>
</property>:q:q
<property>
<name>yarn.scheduler.capacity.root.default.default-node-label-expression</name>
<value>az1</value>
<description>default队列应用默认节点标签</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.accessible-node-labels.az1.capacity</name>
<value>100</value>
<description>default队列对az1标签节点可用的百分比</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.accessible-node-labels.az1.maximum-capacity</name>
<value>100</value>
<description>default队列对az1标签节点最大的百分比</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.accessible-node-labels.az2.capacity</name>
<value>100</value>
<description>default队列对az2标签节点可用的百分比</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.accessible-node-labels.az2.maximum-capacity</name>
<value>100</value>
<description>default队列对az2标签节点最大的百分比</description>
</property>
<!-- root 队列 -->
<property>
<name>yarn.scheduler.capacity.root.accessible-node-labels.az1.capacity</name>
<value>100</value>
<description>root队列对az1标签节点最大的可用百分比</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.accessible-node-labels.az2.capacity</name>
<value>100</value>
<description>root队列对az2标签节点最大的可用百分比</description>
</property>
配置完成后刷新队列:yarn rmadmin -refreshQueues
查看队列Scheduler修改为partition分组:
05: 任务提交到Yarn指定的标签
提交MR任务指定标签:
-Dmapreduce.job.queueName=default -Dmapreduce.job.node-label-expression=az1
# 例子
hadoop jar /data/hadoop-3.1.1/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.1.jar pi 100 100 -Dmapreduce.job.queueName=default -Dmapreduce.job.node-label-expression=az1
Yarn任务:
-queue default -node_label_expression az1
# 例子
hadoop jar /data/hadoop-3.1.1/share/hadoop/yarn/hadoop-yarn-applications-distributedshell-3.1.1.jar -shell_command "sleep 100" -jar /mnt/kmr/hadoop/1/hadoop-3.1.1/share/hadoop/yarn/hadoop-yarn-applications-distributedshell-3.1.1.jar -num_containers 10 -queue default -node_label_expression az1
Hive任务:
set mapreduce.job.node-label-expression=default;
set mapreduce.job.queuename=az1;
Spark任务:
--conf spark.yarn.am.nodeLabelExpression=az1
--conf spark.yarn.executor.nodeLabelExpression=az1
--queue default
# 例子
./bin/spark-submit --class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
--driver-memory 2g \
--executor-memory 2g \
--conf spark.yarn.am.nodeLabelExpression=az1 \
--conf spark.yarn.executor.nodeLabelExpression=az1 \
--queue default \
jars/spark-examples.jar 10
Flink任务:
-ynl,--yarnnodeLabel <arg> :Specify YARN node label
for the YARN application-yqu,--yarnqueue <arg> :Specify YARN queue../bin/flink run -m yarn-cluster -yjm 1024 -ytm 1024 -ynl az1 -yqu default ./examples/batch/WordCount.jar