导读
实际的环境部署中,经常会出现不同的机器类型,比如有些机器是计算型的,有些则是内存型;另一种场景是在大集群中,有时候需要指定有些机器预留给特定的用户用,从而避免其它用户的任务对其造成影响;node label节点标签就是解决这类问题的一种好的方式。运维人员可以根据节点的特性将其分为不同的分区来满足业务多维度的使用需求。
特性
- 一个Node Manager节点只能属于一个label,如果一个资源节点没有配置label,则其属于一个不存在的DEFAULT分区;
- label一共有两种模式:exclusive和non-exclusive,non-exclusive的资源节点同时归属于DEFAULT分区,当用户申请DEFAULT分区的资源时,non-exclusive上的资源也能分配给改应用;
- 用户可以为每个队列配置可以访问的分区,默认是只可以访问DEFAULT分区;
- 可以设置每个队列访问特定分区的资源比率;
- node label以及队列和node label的相关配置支持动态更新;
配置
默认情况下系统时没有开启node label标签功能的,可以在yarn-site.xml
中修改下列配置来开启label特性。
Property | Value |
---|---|
yarn.node-labels.fs-store.root-dir | hdfs://namenode:port/path/to/store/node-labels/ |
yarn.node-labels.enabled | true |
操作说明
- 查询label:
yarn cluster -lnl
- 添加label:
yarn rmadmin -addToClusterNodeLabels [label1,label2,label3] (label splitted by ",")
- 删除label:
yarn rmadmin -removeFromClusterNodeLabels [label1,label2,label3] (label splitted by ",")
- 添加节点标签:
yarn rmadmin -replaceLabelsOnNode [node1[:port]=label1,label2 node2[:port]=label1,label2]
- 查询节点列表:
yarn node -list -all
- 查询单个节点状态:
yarn node -state <nodeId>
CapacityScheduler的label特性
配置参数
Property | Value |
---|---|
yarn.scheduler.capacity.<queue-path>.capacity | 设置队列的容量大小 |
yarn.scheduler.capacity.<queue-path>.accessible-node-labels | 队列可以访问的label列表,如"spark,flink",通过逗号分隔,另外队列均可以访问没有标签的node;默认继承父队列的accessible labels;如果只允许访问无标签的node,配置为一个空格 |
yarn.scheduler.capacity.<queue-path>.accessible-node-labels.<label>.capacity | 队列对某个label的容量设置,对于同一个label属于同一个父队列下面的capacity总和必须为100 |
yarn.scheduler.capacity.<queue-path>.accessible-node-labels.<label>.maximum-capacity | 队列对某个label资源的最大访问容量,默认是100 |
yarn.scheduler.capacity.<queue-path>.default-node-label-expression | 队列默认的访问label,如果请求中未设置label,则设置为该值;默认为空,表现允许访问无label的节点 |
配置实例
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>engineering,marketing</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.engineering.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.marketing.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.engineering.accessible-node-labels</name>
<value>GPU</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.marketing.accessible-node-labels</name>
<value>GPU</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.engineering.default-node-label-expression</name>
<value>GPU</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.engineering.accessible-node-labels.GPU.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.marketing.accessible-node-labels.GPU.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.engineering.default-node-label-expression</name>
<value>GPU</value>
</property>
提交应用指定label
ApplicationSubmissionContext.setNodeLabelExpression(..)
指定应用所有container的node label.
ResourceRequest.setNodeLabelExpression(..)
设置某个具体的ResourceRequest的label信息
setAMContainerResourceRequest.setNodeLabelExpression
设置am请求的node label
FairScheduler Label
当前FairScheduler暂时还不支持node label特性,具体请查看YARN-2497,当前我们自己先基于hadoop-2.7.2版本支持了label特性。新增特性包括:
- 支持queue设置可访问的accessible label
- 支持配置队列的default node label
参数例子
<allocations>
<queue name="spark">
<minResources>1066889mb, 629vcores</minResources>
<maxResources>1066889mb, 629vcores</maxResources>
<maxRunningApps>40</maxRunningApps>
<maxAMShare>0.35</maxAMShare>
<accessibleNodeLabels>GPU,LJH</accessibleNodeLabels>
<defaultNodeLabelExpression>LJH</defaultNodeLabelExpression>
<aclSubmitApps>*</aclSubmitApps>
<aclAdministerApps>sirius</aclAdministerApps>
<weight>1.0</weight>
</queue>
<queue name="router">
<minResources>1066889mb, 629vcores</minResources>
<maxResources>1066889mb, 629vcores</maxResources>
<maxRunningApps>40</maxRunningApps>
<maxAMShare>0.35</maxAMShare>
<aclSubmitApps>*</aclSubmitApps>
<aclAdministerApps>router</aclAdministerApps>
<weight>1.0</weight>
</queue>
</allocations>
具体patch内容请邮件联系liujianhuiouc@163.com