Yarn node label实践

背景

提出对Yarn node label调研实践,根据机器配置和应用程序需求,为集群中的node节点打上标签

预期缓解当前遇到的问题

  • 集群机器跨机房问题
    集群机器跨越两个机房
  • 集群异构问题
    新采购的机器性能大内存和高CPU,偏计算型,老机器偏存储型
  • 多种计算框架共享集群资源
    批处理应用占用大量网络资源或者CPU资源导致准实时计算资源被抢占,eg:离线集群上面的fink应用
  • Docker、GPU等方面后续扩展

Yarn node label简介

实现集群节点按标签分组,应用分配到指定标签组需求

Node label is a way to group nodes with similar characteristics and applications can specify where to run

队列资源控制,通过设置每个队列可以使用的标签资源的百分比,实现控制

yarn.scheduler.capacity.<queue-path>.accessible-node-labels.<label>.capacity
Set the percentage of the queue can access to nodes belong to <label> partition . The sum of <label> capacities for direct children under each parent, must be equal to 100. By default, it’s 0.

实现描述

  • 给集群中的node打上标签,每个node只能有一个标签。
  • 整个集群node划分为互斥的若干分区,没有设置标签的node属于DEFAULT分区。
  • 队列可以绑定多个标签,有一个默认标签,不设置默认标签的队列,使用DEFAULT分区的node。
  • 通过队列的默认标签,和指定特定标签,实现节点分配控制

目前只支持Capacity scheduler
Fair scheduler未提供正式支持,patch参考YARN-2497,未测试

测试小结

测试环境:hadoop-2.6.0-cdh5.6.0

标签设置
默认队列绑定所有label,默认label不设置
队列binjiang绑定,label_bj一个label,默认label为label_bj
队列xiaoshan绑定label_xs,label_bj两个label,默认label为label_xs

yarn.scheduler.capacity.root.accessible-node-labels=*
yarn.scheduler.capacity.root.binjiang.accessible-node-labels=label_bj
yarn.scheduler.capacity.root.xiaoshan.accessible-node-labels=label_xs,label_bj
yarn.scheduler.capacity.root.default.default-node-label-expression=
yarn.scheduler.capacity.root.binjiang.default-node-label-expression=label_bj
yarn.scheduler.capacity.root.xiaoshan.default-node-label-expression=label_xs

测试作业:
测试表现

  • 对机器节点打上不同的标签,将集群划分多个互斥的node分区
  • 作业任务会分配到队列所属的label node上面
  • 没有设置label node的队列,任务分配到没有label的node上面
  • 如果所有node已经分配标签,那么作业在默认队列无法运行

测试示例:

hadoop jar ~/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.6.0.jar pi  5 10
hadoop jar ~/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.6.0.jar pi -Dmapreduce.job.queuename=xiaoshan 5 10

默认队列作业会跑到没有设置label的节点上
binjiang队列,默认label为label_bj,只会跑在label_bj的机器上
label_xs队列,虽然设置了两个label,默认label为label_xs,默认只跑在label_xs的机器上
在这里插入图片描述

如果需要修改,需要另外的方式指定label(Java API以及saprk支持,MR不支持)

测试发现的问题(针对版本hadoop-2.6.0-cdh5.6.0)

  1. 修改root.default 默认标签,测试不生效,默认队列只能使用没有标签的node
  2. 只能用默认的exclusive模式(分区独占,不共享给DEFAULT分区),测试addToClusterNodeLabels “label_xs2(exclusive=false)” 报错
  3. 小问题,hadoop 2.6 不支持yarn cluster命令,只能从单个node的角度管理,不能从label的角度管理(可以自行封装问题不大)。

指定特定队列标签场景整理
MR任务指定标签
hadoop2.8后支持指定标签,详见MAPREDUCE-6304,未测试自行patch

spark指定特定标签
通过参数spark.yarn.am.nodeLabelExpression 和spark.yarn.executor.nodeLabelExpression

Java API 指定特定label(未测试)

Applications can use following Java APIs to specify node label to request  
ApplicationSubmissionContext.setNodeLabelExpression(..) to set node label expression for all containers of the application.
ResourceRequest.setNodeLabelExpression(..) to set node label expression for individual resource requests. This can overwrite node label expression set in ApplicationSubmissionContext
Specify setAMContainerResourceRequest.setNodeLabelExpression in ApplicationSubmissionContext to indicate expected node label for application master container.

测试结论:
基本功能符合预期
达到通过不同的队列作业,分配到不同node分区运行的效果
当前版本不支持MR任务指定标签。通过队列的默认标签达到控制目的,已经可以满足目前大部分使用场景。
Spark summit可以有参数指定到某个队列的某个标签

详细测试过程

修改队列配置
vi yarn-site.xml
vi capacity-scheduler.xml
yarn rmadmin -refreshQueues
增加node label
yarn rmadmin -addToClusterNodeLabels label_bj,label_xs
yarn rmadmin -replaceLabelsOnNode "server3.x.net,label_bj"
yarn rmadmin -replaceLabelsOnNode "server4.x.net,label_xs"

删除node label(置空)
yarn rmadmin -replaceLabelsOnNode "server5.x.net"
查看node label
yarn node -list
yarn node -status server4.x.net:34467
mr作业测试
hadoop jar ~/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.6.0.jar pi  5 10
hadoop jar ~/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.6.0.jar pi -Dmapreduce.job.queuename=xiaoshan 5 10
spark submit 验证
/home/hadoop/spark/bin/spark-submit --master yarn --queue xiaoshan --conf spark.yarn.am.nodeLabelExpression=label_bj  --conf spark.yarn.executor.nodeLabelExpression=label_bj --num-executors 2 --class org.apache.spark.examples.SparkPi /home/hadoop/spark-examples_2.11-2.0.2.jar 100

在这里插入图片描述
不指定特定标签的情况
在这里插入图片描述

验证结论

默认队列作业跑到没有设置label的节点上
xiaoshan队列的作业会跑到label_xs的节点
MR不支持额外指定标签的方式,spark支持

Attention

默认队列没有设置标签,只能使用没有标签的node(测试修改default队列的efault-node-label不生效)。如果所有node已经分配标签,那么作业跑到默认队列是跑不起来的。

<property>
  <name>yarn.scheduler.capacity.root.default.default-node-label-expression</name>
  <value> </value>
</property>

参考

https://hadoop.apache.org/docs/r2.7.3/hadoop-yarn/hadoop-yarn-site/NodeLabel.html

附录

yarn-site.xml

<!-- add by weichan on 20190328 to support node label -->
<property>
        <name>yarn.node-labels.enabled</name>
        <value>true</value>
</property>
<property>
    <name>yarn.node-labels.manager-class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager</value>
</property>
<property>
        <name>yarn.node-labels.fs-store.root-dir</name>
        <value>hdfs://testcluster/system/node-labels</value>
</property>
<property>
    <name>yarn.resourcemanager.scheduler.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>

capacity-scheduler.xml

<configuration>

<property>
  <name>yarn.scheduler.capacity.root.queues</name>
  <value>default,guangzhou,binjiang,xiaoshan</value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.default.capacity</name>
  <value>40</value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.binjiang.capacity</name>
  <value>30</value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.xiaoshan.capacity</name>
  <value>30</value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
  <value>100</value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.binjiang.maximum-capacity</name>
  <value>100</value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.xiaoshan.maximum-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.binjiang.accessible-node-labels</name>
  <value>label_bj</value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.xiaoshan.accessible-node-labels</name>
  <value>label_xs,label_bj</value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.accessible-node-labels.label_bj.capacity</name>
  <value>60</value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.accessible-node-labels.label_xs.capacity</name>
  <value>40</value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.binjiang.accessible-node-labels.label_bj.capacity</name>
  <value>50</value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.xiaoshan.accessible-node-labels.label_xs.capacity</name>
  <value>100</value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.xiaoshan.accessible-node-labels.label_bj.capacity</name>
  <value>50</value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.default-node-label-expression</name>
  <value> ,label_bj,label_xs</value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.default.default-node-label-expression</name>
  <value> </value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.binjiang.default-node-label-expression</name>
  <value>label_bj</value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.xiaoshan.default-node-label-expression</name>
  <value>label_xs</value>
</property>

</configuration>
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值