文章目录
- Node Labels
- 配置
- 启用node labels功能
- 查看label
- 添加label
- 移除label
- 添加映射,根据上面配置的类型不同,配置分别如下
- Centralized:只需通过yarn命令即可
- Distributed
- Delegated-Centralized
- 将标签与队列映射
- 示例
- Application指定label(java api方式):
Node Labels
简单来说,这是一种给节点打标签的特性。可以给集群中不同的节点打上不同的标签,从而可以将集群划分成不同的分区。同时节点可以和队列做映射,这样可以控制队列的任务运行在不同的分区中,并且也可以指定每个分区在该队列上可用的资源容量。
特点
- 集群划分:每个节点可以指定一个标签,这样可以将集群划分成好几个分区。
- ACL:用户可以指定每个队列可以访问的标签节点。
- 资源配置:队列可以映射多个标签,并且可以指定此标签的分区节点在该队列的资源容量。在资源请求中,可以指定标签,这样container将会分配到同样标签的节点上,如果没有指定,默认分配到default分区(未打标的机器属于default分区)。
分区类型
- Exclusive:container会分配到对应的标签节点,有剩余资源也不会与default分区共享。
- Non-execusive:此分区剩余资源可以与default分区共享资源。
将节点与标签做映射的方式有三种
- Centralized:类似集中统一管理,通过ResourceManager暴露的CLI、REST和RPC接口来实现。
- Distributed:分布式,通过NodeManager节点的配置文件来实现。有两种,Script based provider and Configuration based provider。
- Delegated-Centralized:通过在ResourceManager上的配置来实现,这种实际是NodeManager注册到RM时通过接口获取的,支持周期刷新。
配置
启用node labels功能
- yarn.node-labels.enabled
true
指定节点配置类型
- yarn.node-labels.configuration-type
Centralized或Distributed或Delegated-Centralized
存储label的路径 该目录需要创建并且RM需要有权限访问
- yarn.node-labels.fs-store.root-dir
可配置hdfs:// 或本地 file:///
查看label
yarn cluster --list-node-labels
yarn node -status //查看节点的
添加label
如果不指定exclusive 则默认为false
yarn rmadmin -addToClusterNodeLabels
“label_1(exclusive=true/false),label_2(exclusive=true/false)”
移除label
yarn rmadmin -removeFromClusterNodeLabels “[,,…]”
注意:不能直接删除与队列绑定的label。
添加映射,根据上面配置的类型不同,配置分别如下
Centralized:只需通过yarn命令即可
- yarn rmadmin -replaceLabelsOnNode “node1[:port]=label1 node2=label2” [-failOnUnknownNodes]
如果不指定端口,默认机器上所有的NM都会添加(这种一般针对机器上有多个NM)
-failOnUnknownNodes参数 如果指定,则如果节点unknown,操作也会fail
Distributed
- yarn.node-labels.configuration-type:distributed
- yarn.nodemanager.node-labels.provider:可以配置config或script或继承nodelabelsprovider的类名
- yarn.nodemanager.node-labels.resync-interval-ms :NM会将标签信息通过心跳一起发送到RM 此配置是指定间隔时间
- yarn.nodemanager.node-labels.provider.fetch-interval-ms 从配置的类中获取标签的间隔时间
- yarn.nodemanager.node-labels.provider.fetch-timeout-ms 如果是通过script获取标签,此配置指定每次获取的超时时间
- yarn.nodemanager.node-labels.provider.script.path 指定要运行的script的路径 "NODE_PARTITION:"之后的内容将视为标签
- yarn.nodemanager.node-labels.provider.script.opts 指定脚本运行的参数
- yarn.nodemanager.node-labels.provider.configured-node-partition 如果是config 则该配置的值即为标签
Delegated-Centralized
- yarn.node-labels.configuration-type:delegated-centralized
- yarn.resourcemanager.node-labels.provider:需要配置继承RMNodeLabelsMappingProvider的类名
- yarn.resourcemanager.node-labels.provider.fetch-interval-ms:从程序获取标签的间隔时间
将标签与队列映射
- yarn.scheduler.capacity..capacity 指定default分区的队列容量
- yarn.scheduler.capacity..accessible-node-labels
配置队列可以访问的标签,多个以逗号分隔。
注:没有标签的节点,所有队列均可以访问。如果不指定,则继承父队列的。如果想队列只能访问没有标签的节点,设置此值为空格。
- yarn.scheduler.capacity..accessible-node-labels..capacity 配置队列可以访问的分区容量
- yarn.scheduler.capacity..accessible-node-labels..maximum-capacity 配置队列可以访问的分区绝对最大容量
- yarn.scheduler.capacity..default-node-label-expression 用于配置默认分区 如果提交任务到该队列时没有指定标签,则默认为此值。默认为空,也就是不指定标签将会运行在没有标签的节点。
示例
例子:
root
-default
-a
-b
有5个节点(h1-h5),每个节点24G、24vcores。h5属于test
#三个队列
yarn.scheduler.capacity.root.queues=default,a,b
#每个队列占用default分区的三分之一资源 也就是24*4/3 32G 32vcores
yarn.scheduler.capacity.root.default.capacity=33
yarn.scheduler.capacity.root.a.capacity=34
yarn.scheduler.capacity.root.b.capacity=33
#只有a和b队列可以访问GPU标签的节点
yarn.scheduler.capacity.root.a.accessible-node-labels=test
yarn.scheduler.capacity.root.b.accessible-node-labels=test
#每个队列可以使用GPU分区的1/2资源 12G 12vcore
yarn.scheduler.capacity.root.a.accessible-node-labels.test.capacity=50
yarn.scheduler.capacity.root.b.accessible-node-labels.test.capacity=50
yarn.scheduler.capacity.root.a.default-node-label-expression=test
注意:给节点打label可以将集群划分成不同的分区 队列与标签做映射 实际只是指定可以使用该分区的资源(accessible-node-labels) 只有资源请求时指定了label 才能使用其分区的资源 不然默认如果不设置(default-node-label-expression) 作业都将运行到default分区
上面的例子中 a队列可以访问test分区 并且默认就是test 这样提交作业时将一直处于ACCEPTED状态 因为只有资源请求带所属标签才可以使用那一部分资源。b队列 默认提交作业 可以运行到default分区
Application指定label(java api方式):
- ApplicationSubmissionContext.setNodeLabelExpression(…):为app的所有容器设置节点标签。
- ResourceRequest.setNodeLabelExpression(…):为单个资源请求设置节点标签。这可以覆盖ApplicationSubmissionContext中的节点标签设置。
- setAMContainerResourceRequest.setNodeLabelExpression:在ApplicationSubmissionContext中使用setNodeLabelExpression可以设置am的节点标签。
结论:
总的来说,该特性可以将不同的机器划分不同分区,配置使用Centralized方式也比较简便。但是目前提交app指定label只能使用java api的方式,如果用户开发仅仅通过sql,那此功能属于鸡肋。如果后面版本可以使用命令行指定,就比较方便了。