hadoop版本从2.7.2版本开始 新增标签调度功能。
标签调度功能:可以给节点设置标签 让作业任务调度到这个设置的标签节点。
列入:
某个任务需要用到gpu资源,而gpu并非在每个节点上都有,通过对节点设置标签,可以使作业任务正确调度到含gpu资源的节点上,确保作业任务正确运行。
接下来我们开始配置这一个功能
首先我们采用的环境版本—我这边采用HDP集群 当然开源方案一样可以参考
组件 | 版本 |
JDK | 1.8.0_281 |
Hadoop | 3.1.1.3.1 |
【开始配置】
首先我们启动标签功能
在yarn-site中加入如下参数:<property><name>yarn.node-labels.enabled</name><value>true</value></property><property><name>yarn.node-labels.fs-store.root-dir</name><value>hdfs://migratecluster/yarn/node-labels</value></property>注意其中migratecluster需要换成自己的nameservices具体参数可以在hdfs-site、core-site配置文件中查找dfs.internal.nameservices还需要注意我这边使用的是hdp默认的这个hdfs目录yarn.node-labels.fs-store.root-dir=/system/yarn/node-labels解释:配置项yarn.node-labels.enabled表示是否启用标签功能。yarn.node-labels.fs-store.root-dir表示标签的存储位置,可以是本地文件,也可以是hdfs上的存储路径(文件目录会自动进行创建)
对于HDP集群来讲已经有这个按钮直接enable开启即可~
十分方便
保存重启yarn服务
重启完成后
就该在集群中添加标签了
添加标签可以直接使用yarn命令 添加一个gpu标签— 这步需要yarn用户执行
yarn rmadmin -addToClusterNodeLabels "gpu(exclusive=true)"
exclusive表示是否独占,具体可以理解为,当该标签分区下的节点有空闲资源时,是否可以共享给default分区的任务使用。
true表示独占,即不共享,资源仅分配给具有该标签的任务使用。
false表示非独占,即可以共享。
添加标签前,rm的界面上,可以看到只有DEFAULT标签(如下图所示)
从上图可以看出来,gpu这个标签对应的分区中都还没有活跃的NM节点。
NM节点关联标签
完成标签的添加后,接下来就是给指定的节点关联到不同的标签上,也就是将集群的节点按标签划分成不同的节点分区。
yarn rmadmin -replaceLabelsOnNode "172.16.121.249:8042=gpu"
执行上面的命令后,再来看看rm的界面,可以看到gpu的标签,有了一个活跃的节点,而DEFAULT标签中则少了一个活跃节点。
从NM节点列表的界面中,也可以看到该节点有了对应的标签信息。
同时,队列的界面中,也多出了对应的标签信息,所有队列均会出现在所有标签中。
但是gpu标签下还未设置对应标签的使用容量。
设置队列可访问的标签与容量
注意:HDP的Yarn Queue Manager界面—也可以 推荐用HDP Yarn Manager添加
推荐Yarn Queue Manager添加方法
一共注意下面3个框框中的东西 一个是启动标签队列 选择标签队列 还有就是默认提交这个队列为标签队列
保存后会自动刷新
配置修改方法: 不推荐手动添加的方法
搜索配置:capacity-scheduler.xml加入如下配置<!-- default队列 --><property><name>yarn.scheduler.capacity.root.default.accessible-node-labels</name><value>gpu</value><description>default队列应用可用的节点标签</description></property>:q:q<property><name>yarn.scheduler.capacity.root.default.default-node-label-expression</name><value>gpu</value><description>default队列应用默认节点标签</description></property><property><name>yarn.scheduler.capacity.root.default.accessible-node-labels.gpu.capacity</name><value>100</value><description>default队列对gpu标签节点可用的百分比</description></property><property><name>yarn.scheduler.capacity.root.default.accessible-node-labels.gpu.maximum-capacity</name><value>100</value><description>default队列对gpu标签节点最大的百分比</description></property><!-- root 队列 --><property><name>yarn.scheduler.capacity.root.accessible-node-labels.gpu.capacity</name><value>100</value><description>root队列对gpu标签节点最大的可用百分比</description></property>
HDP参数如下:
yarn.scheduler.capacity.root.default.accessible-node-labels=gpuyarn.scheduler.capacity.root.default.default-node-label-expression=gpuyarn.scheduler.capacity.root.default.accessible-node-labels.gpu.capacity=100yarn.scheduler.capacity.root.default.accessible-node-labels.gpu.maximum-capacity=100yarn.scheduler.capacity.root.accessible-node-labels.gpu.capacity=100
参数含义:1. yarn.scheduler.capacity.root.default.accessible-node-labels=gpu* 含义: 设置 default 队列可以访问的节点标签为 "gpu"。2. yarn.scheduler.capacity.root.default.default-node-label-expression=gpu* 含义: 设置 default 队列应用的默认节点标签为 "gpu"。3. yarn.scheduler.capacity.root.default.accessible-node-labels.gpu.capacity=100* 含义: 设置 default 队列可访问 "gpu" 标签节点的容量百分比为 100%。4. yarn.scheduler.capacity.root.default.accessible-node-labels.gpu.maximum-capacity=100* 含义: 设置 default 队列对 "gpu" 标签节点的最大可用容量百分比为 100%。5. yarn.scheduler.capacity.root.accessible-node-labels.gpu.capacity=100* 含义: 设置 root 队列可访问 "gpu" 标签节点的容量百分比为 100%。
配置完成后,通过命令刷新队列使配置生效,在界面中可以看到如下信息:
冒烟测试
提交hive任务指定标签
set mapreduce.job.node-label-expression=gpu;set mapreduce.job.queuename=defalt;
一开始提交不上注意这个参:
将标签与队列映射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 用于配置默认分区 如果提交任务到该队列时没有指定标签,则默认为此值。默认为空,也就是不指定标签将会运行在没有标签的节点。