Overview
Node label 可以用于对Node分组
目前支持的node partition语义如下:
- 一个节点属于一个节点分区,因此一个集群按节点分区划分为多个不相交的子集群。默认情况下,节点属于默认分区(partition="")
- 用户需要配置不同队列可以使用的节点分区,以及每个节点分区可用的资源百分比
Exclusive vs Non-exclusive
node partitions可以被指定为Exclusive
或Non-exclusive
:
- Exclusive: 完全匹配, 有剩余资源如果不匹配也不共享
- Non-exclusive:剩余资源可以和
DEFAULT partition
共享
用户可以指定每个队列可以访问的节点标签集,一个应用程序只能使用包含应用程序的队列可以访问的节点标签集。
Features
Node Labels 支持如下特征:
Partition cluster - 每个节点可以被打一个标签,可以用于按标签将集群划分为多个分区
ACL of node-labels on queues - 用户可以在每个队列上设置可访问的节点标签,因此只有某些节点只能由特定队列访问
Specify percentage of resource of a partition which can be accessed by a queue - 用户可以设置百分比,例如:队列A可以访问label=hbase节点上30%的资源。这样的百分比设置将与现有的资源管理器一致。
在资源请求中指定所需的节点标签,只有当节点具有相同的标签时才会分配。如果未指定节点标签要求,则此类资源请求将仅分配给属于默认分区的节点(Non-exclusive node partition的空闲资源应该也可以)
-
Operability
- 节点标签和节点标签映射可以在RM restart后恢复
- Update node labels - admin 可以在RM运行期修改节点的标签以及队列可以访问的标签
-
可以通过三种方式将NM映射到节点标签,但在所有方法中,分区标签都应该是RM中配置的有效节点标签列表之一:
Centralized : 节点到标签的映射可以通过RM 暴露的 CLI、REST或RPC完成。
Distributed : 节点到标签的映射可以通过 NM中的Node Labels Provider完成。yarn提供了基于脚本的provider和基于配置文件的provider。在脚本的情况下,可以使用脚本路径配置NM,并且脚本可以发出节点的标签。在配置的情况下,节点标签可以直接在NM的yarn-site.xml中配置。在这两个选项中,都支持标签映射的动态刷新。
Delegated-Centralized : 节点到标签的映射可以通过RM中的Node Labels Provider完成. 当由于安全问题而无法由每个节点提供标签映射时,这将很有帮助,避免了大型集群中每个节点的与RM接口进行频繁德交互。在NM注册期间,将从该接口获取标签,并支持定期刷新。
Configuration
开启节点标签功能
Property | Value |
---|---|
yarn.node-labels.fs-store.root-dir | hdfs://namenode:port/path/to/store/node-labels/ |
yarn.node-labels.enabled | true |
yarn.node-labels.configuration-type | 可以指定 “centralized”, “delegated-centralized” 或“distributed”. 默认是 “centralized”. |
增加/修改YARN Node Labels
yarn rmadmin -addToClusterNodeLabels "label_1(exclusive=true/false),label_2(exclusive=true/false)"
exclusive 默认是true
查看标签
yarn cluster --list-node-labels
删除YARN Node Labels
yarn rmadmin -removeFromClusterNodeLabels "<label>[,<label>,...]".
增加/修改标签映射
yarn rmadmin -replaceLabelsOnNode “node1[:port]=label1 node2=label2” [-failOnUnknownNodes].
Configuration of Schedulers for node labels
Capacity Scheduler Configuration
Property | Value |
---|---|
yarn.scheduler.capacity.<queue-path>.capacity | Set the percentage of the queue can access to nodes belong to DEFAULT partition. The sum of DEFAULT capacities for direct children under each parent, must be equal to 100. |
yarn.scheduler.capacity.<queue-path>.accessible-node-labels | Admin need specify labels can be accessible by each queue, split by comma, like “hbase,storm” means queue can access label hbase and storm. All queues can access to nodes without label, user don’t have to specify that. If user don’t specify this field, it will inherit from its parent. If user want to explicitly specify a queue can only access nodes without labels, just put a space as the value. |
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. |
yarn.scheduler.capacity.<queue-path>.accessible-node-labels.<label>.maximum-capacity | Similar to yarn.scheduler.capacity.<queue-path>.maximum-capacity, it is for maximum-capacity for labels of each queue. By default, it’s 100. |
yarn.scheduler.capacity.<queue-path>.default-node-label-expression | Value like “hbase”, which means: if applications submitted to the queue without specifying node label in their resource requests, it will use “hbase” as default-node-label-expression. By default, this is empty, so application will get containers from nodes without label. |
example
root
/ | \
engineer sales marketing
我们在集群中有5个节点(主机名=h1..h5),每个节点有24G内存,24个vCore。5个节点中有1个节点有GPU(假设是h5)。所以管理员给h5增加了GPU标签。
假设用户有一个容量调度程序配置,如:(这里使用key=value表示增加可读性)
yarn.scheduler.capacity.root.queues=engineering,marketing,sales
yarn.scheduler.capacity.root.engineering.capacity=33
yarn.scheduler.capacity.root.marketing.capacity=34
yarn.scheduler.capacity.root.sales.capacity=33
yarn.scheduler.capacity.root.engineering.accessible-node-labels=GPU
yarn.scheduler.capacity.root.marketing.accessible-node-labels=GPU
yarn.scheduler.capacity.root.engineering.accessible-node-labels.GPU.capacity=50
yarn.scheduler.capacity.root.marketing.accessible-node-labels.GPU.capacity=50
yarn.scheduler.capacity.root.engineering.default-node-label-expression=GPU
对于h1到h4 ,engineer sales marketing
每个可以使用1/3的资源
只有engineering和marketing
可以使用GPU机器,每个可以使用1/2的资源
Applications 指定标签Java api
-
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 inApplicationSubmissionContext
- Specify
setAMContainerResourceRequest.setNodeLabelExpression
inApplicationSubmissionContext
to indicate expected node label for application master container