什么是Label based scheduling?
故名思议,Label based scheduling是一种调度策略,就像priority-based scheduling一样,是调度器调度众多调度策略中的一种,可以跟其他调度策略混合使用,实际上,hadoop也是这样做的。但是,相比于其他调度策 略,基于标签的调度策略则复杂的多,这个feature的代码量非常大,基本上需要修改YARN的各个模块,包括API, ResourceManager,Scheduler等。该策略的基本思想是:用户可以为每个nodemanager标注几个标签,比如 highmem,highdisk等,以表明该nodemanager的特性;同时,用户可以为调度器中每个队列标注几个标签,这样,提交到某个队列中的 作业,只会使用标注有对应标签的节点上的资源。举个例子:
比如最初你们的hadoop集群共有20个节点,硬件资源是32GB内存,4TB磁盘;后来,随着spark地流行,公司希望引入spark计算框 架,而为了更好地运行spark程序,公司特地买了10个大内存节点,比如内存是64GB,为了让spark程序与mapreduce等其他程序更加和谐 地运行在一个集群中,你们希望spark程序只运行在后来的10个大内存节点上,而之前的mapreduce程序既可以运行在之前的20个节点上,也可以 运行在后来的10个大内存节点上,怎么办?有了label-based scheduling后,这是一件非常easy的事情,你需要按一以下步骤操作:
步骤1:为旧的20个节点打上normal标签,为新的10个节点打上highmem标签;
步骤2:在capacity scheduler中,创建两个队列,分别是hadoop和spark,其中hadoop队列可使用的标签是nornal和highmem,而spark则是highmem,并配置两个队列的capacity和maxcapacity。
如何配置使用Label based scheduling?
首先,要选择apache hadoop 2.6或hdp2.2(可使用ambari部署)发行版。
之后按照以下步骤操作:
步骤1:添加系统级别的label(相当于所有label的全集),注意,各个节点上的label必须都在系统级别的label中。
yarn rmadmin -addToClusterNodeLabels normal,highmem
步骤2:为各个节点分别添加label(可动态修改)
yarn rmadmin -replaceLabelsOnNode “nodeId,label1,label2,…,labeln”
注意,nodeId是nodemanager的唯一标示,注意,一个节点上可以有多个nodemanager,每个nodemanager的 nodeid可以在ResourceManager界面上看到,通常有host和PRC port拼接而成,默认情况下,各个nodemanager的RPC port是随机选取的,你可以将所有的nodemanager配置成一样的,便于管理:
<property>
<name>yarn.nodemanager.address</name>
<value>0.0.0.0:45454</value>
</property>
步骤3:配置label重启恢复功能。这样,label信息会保存到hdfs上(默认是保存在内存中的),之后yarn重新启动,可以自动恢复所有label信息:
<property>
<name>yarn.node-labels.manager-class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager</value>
</property>
步骤4:修改capacity scheduler相关配置,设置每个队列对应的label,以及每中label的资源上下限。具体配置,可参考相关资源。
总结
基于标签的调度策略是hadoop yarn新引入的feature,它能让YARN更好地运行在异构集群中,进而更好地管理和调度混合类型的应用程序。
转自:董的博客
如果觉得本博客对您有帮助,请 赞助作者 。