背景
当Hadoop集群需要提供SLA资源隔离的时候,有两个选择,一个是独立建立新的集群,另一个是通过yarn node label特性来通过软件设置隔离。这里介绍后者来实现方案落地。
环境
Hadoop版本:2.6.0-cdh5.13.0以上
RM模式非HA,NM数:5
构建步骤
步骤1.Node-Label相关配置,加在yarn-site.xml里面,目前只有capacity scheduler支持比较好。
<property>
<name>yarn.node-labels.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.node-labels.fs-store.root-dir</name>
<value>file:///home/yarn/node-label</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
然后启动rm。
步骤2,添加label标签。
yarn rmadmin -addToClusterNodeLabels "label1,label2"
步骤3,給nodemager节点打上标签
$ yarn rmadmin -replaceLabelsOnNode "hostname1,label1 hostname2,label2"
注意这里的格式为,label+空格区分+,label2。
然后可以通过命令行或RM UI观察标签是否打成功。
步骤4,划分队列标签。在root队列下划分出a,b队列,a队列的任务对应label1标签,b对应label2标签。配置如下:
<property>
<name>yarn.scheduler.capacity.root.accessible-node-labels.label1.capacity</name>
<value>100</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.accessible-node-labels.label2.capacity</name>
<value>100</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.a.accessible-node-labels</name>
<value>label1</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.b.accessible-node-labels</name>
<value>label2</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.a.capacity</name>
<value>30</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.b.capacity</name>
<value>10</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.a.accessible-node-labels.label1.capacity</name>
<value>100</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.b.accessible-node-labels.label2.capacity</name>
<value>100</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.a.default-node-label-expression</name>
<value>label1</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.b.default-node-label-expression</name>
<value>label2</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.default-node-label-expression</name>
<value></value>
</property>
步骤5,刷新队列
yarn rmadmin -refreshQueues
通过UI观察是否配置生效,标签是否已加入队列a,b.
步骤6,指定队列,提交hive任务,判断任务是否只允许再标签对应的节点上。
经过多次分标签a,b测试,的确跑在标签所属下的节点上。
步骤7, 压测
通过压测程序进行label标签下的分配测试,运行SliveTest,执行命令如下:
cd /home/vipshop/platform/hadoop-2.7.6/share/hadoop/mapreduce/
yarn jar hadoop-mapreduce-client-jobclient-2.7.6.jar SliveTest -maps 40 -duation 172800 -reduce 20 -blockSize 1073741824 -files 10000000 -dirs 50000
没有发现性能问题,RM连续分配40个Container在指定标签下。