文章目录

  • Node Labels
  • 配置
  • 启用node labels功能
  • 查看label
  • 添加label
  • 移除label
  • 添加映射,根据上面配置的类型不同,配置分别如下
  • Centralized:只需通过yarn命令即可
  • Distributed
  • Delegated-Centralized
  • 将标签与队列映射
  • 示例
  • Application指定label(java api方式):


Node Labels

简单来说,这是一种给节点打标签的特性。可以给集群中不同的节点打上不同的标签,从而可以将集群划分成不同的分区。同时节点可以和队列做映射,这样可以控制队列的任务运行在不同的分区中,并且也可以指定每个分区在该队列上可用的资源容量。

特点

  1. 集群划分:每个节点可以指定一个标签,这样可以将集群划分成好几个分区。
  2. ACL:用户可以指定每个队列可以访问的标签节点。
  3. 资源配置:队列可以映射多个标签,并且可以指定此标签的分区节点在该队列的资源容量。在资源请求中,可以指定标签,这样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,那此功能属于鸡肋。如果后面版本可以使用命令行指定,就比较方便了。