hadoop 标签调度实战

2,069 阅读3分钟
将集群中的节点分门别类,对提交的任务根据需要指定分配到对应分类的集群节点上。

RM节点修改yarn-site.xml配置,修改以下参数。

<property>
  <name>yarn.resourcemanager.scheduler.class</name>
  <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
<property>
  <name>yarn.node-labels.enabled</name>
  <value>true</value>
</property>
<property>
  <name>yarn.node-labels.fs-store.root-dir</name>
  <value>/yarn-label</value>
</property>
<property>
  <name>yarn.node-labels.configuration-type</name>
  <value>distributed</value>
</property>

参数解释:

  1. yarn.resourcemanager.scheduler.class:调度器参数。标签调度需要需要配置容量调度
  2. yarn.node-labels.enabled:标签调度开关
  3. yarn.node-labels.configuration-type:标签配置信息的方式。centralized, delegated-centralized, distributed三种。
  4. yarn.node-labels.fs-store.root-dir:标签信息存放路径(这个地方是hdfs根目录下的yarn-label文件夹)

RM节点修改capacity-scheduler.xml配置,队列设置。

<configuration>
  <property>
	<name>yarn.scheduler.capacity.root.queues</name>
	<value>online,nearline,offline</value>
  </property>
  <!-- 默认标签的队列配置 -->
  <property>
	<name>yarn.scheduler.capacity.root.online.capacity</name>
	<value>1</value>
  </property>
  <property>
	<name>yarn.scheduler.capacity.root.nearline.capacity</name>
	<value>49</value>
  </property>
  <property>
	<name>yarn.scheduler.capacity.root.offline.capacity</name>
	<value>50</value>
  </property>
  <!--队列访问标签设置-->
  <property>
	<name>yarn.scheduler.capacity.root.online.accessible-node-labels</name>
	<value>online-label</value>
  </property>
  <property>
	<name>yarn.scheduler.capacity.root.online.default-node-label-expression</name>
	<value>online-label</value>
  </property>
  <!--标签资源设置-->
  <property>
	<name>yarn.scheduler.capacity.root.accessible-node-labels.online-label.capacity</name>
	<value>100</value>
  </property>
  <property>
	<name>yarn.scheduler.capacity.root.online.accessible-node-labels.online-label.capacity</name>
	<value>100</value>
  </property>
</configuration>

解释:

集群中的节点被打上标签后,相当于把集群中的节点按照tag进行了划分,粗略的可以理解为把一个集群划分成了多个子集群。没有打标签的机器,会被划分到一个DEFAULT_PATITION中。配置中<!-- 默认标签的队列配置 -->的配置,实质上就是配置DEFAULT_PATITION中的各个队列的资源分配情况。而<!-- 队列访问标签设置 -->中,配置的是什么队列允许访问什么标签子集群以及队列中任务默认被提交到什么标签集群中。<!-- 标签资源设置 -->中,则是设置各个队列针对对应子集群的资源分配情况。

DEFAULT_PATITION可以看成是打了个标签,名字是DEFAULT_PATITION。

ps:之所以配置中默认标签资源分配中,给online队列分配的资源是1%,是为了在提交任务时指定online队列不报错:

......org.apache.hadoop.security.AccessControlException: Queue root.online already has 0 applications, cannot accept submission of application:xxxx.......

重启RM

重启RM之后,集群就支持了标签调度了。剩下就是给集群新增标签并且绑定到指定节点上了。

配置标签信息:

# 集群中增加标签
shell> yarn rmadmin -addToClusterNodeLabels "online-label"  
# 给节点打标签,10.123.123.123:5000是我的nodemanager地址,nm上的yarn.nodemanager.address值。也可以在yarn的WEB UI上找到NM地址。
shell> yarn rmadmin -replaceLabelsOnNode 10.123.123.123:5000,online-label  

over!

PS:

  • 其他一些命令

shell> yarn cluster --list-node-labels  # 检查已经添加label
shell> yarn rmadmin -removeFromClusterNodeLabels "<label>[,<label>,...]"  # 删除label,已经关联queue的label无法删除
# 节点绑定标签完整语句,exclusive(默认true,hadoop2.7.6以后支持false)表示是否排斥DEFAULT_PATITION的任务,否的话说明不仅接受本标签的任务,还接受DEFAULT_PATITION的任务。
shell> yarn rmadmin -addToClusterNodeLabels "label_1(exclusive=true/false),label_2(exclusive=true/false)”