目标:

  1. 提供一种可靠的机制在特定的节点运行应用程序。
  2. 为队列提供一种可靠的机制在特定的节点上进行资源的调度
  3. 提供一种机制解决队列和application所定义节点在哪运行

定义

  • Node Label – 描述一个节点的标签,每个节点可以拥有多个标签
  • Label expression – 逻辑上的标签组合(使用 && 或 and,|| 或 or,!或 not)
  • Queue label – Label expression 决定哪些节点属于这个队列
  • Application Label – Label expression 决定应用程序容器在哪些节点运行
  • Queue Label Policy – Label Policy 配置在Queue中,其定义规则解决application label和queue label之间的冲突

使用案例

cluster A使用Fair Scheduler去调度application在他的节点上。 cluster 管理员定义多个队列包括嵌套队列去划分资源给不同的组织,所以每个组织都可以共享资源去使用。 除此之外,集群还在不同方面存在异构:

  • 拥有不同类型的硬件(一些节点拥有大内存,多CPU,有些则网络带宽占优势)
  • 数据在DFS中切分到分配到不同的节点/机架上
  • 其他的不同等等

cluster管理员根据差异用标签标记所有的节点:

  • 大内存使用red标记
  • 高CPU的使用blue标记
  • 高网络带宽的使用green标记
  • 节点在机架A标记为-rackA
  • 节点在机架B标记未-rackB

因为被标记为red的节点可以在rackA和rackB cluster管理员可以分配多个标签给它:

Node Regex Label1 Label2 LabelN
rackA_red red rackA
rackA_blue blue rackA
rackB_red red rackB

如果我们希望所有的应用提交到Queue1即运行在“rackA_red”或“rackA_blue”节点上,cluster管理员可以调整label expression即配置Queue1为(red || blue)&& rackA

另外cluster管理员配置Queue Policy去定义调度器的行为,假设提交的application也拥有自己的label expression

  • Queue Lable Expression优先
  • Application Label Expression优先
  • 取它们的交集
  • 取它们的或集

现在,用户B提交一个app到Queue1,但是这个app属于计算密集型的,他希望运行在高cpu的节点上,所以,这个app的lable expression可以为 “blue && rackA”

幸运的是集群管理员设置Queue Policy为“AND”,所以application将会被调度在“rackA_blue”的节点上运行。 假设集群管理员设置Queue Policy为“OR”,结果将会变为:“((red || blue) && rackA) || (blue && rackA)” ,即”(red || blue) && rackA”

设计

Node Labels, Label Expressions, Policies

Node Labels

最初的JIRA建议每个节点指定他们自己拥有的标签,并提供这些信息给ResourceManager. 我们建议集中式的把节点的标签存储到DFS上,所有的YARN daemons都可以访问,修改也不需要同步到整个集群或者客户端

标签可以被指定为下列的格式:

perfnode.* big, fast, physical, scale.* virtual, “slow”, perfnode30 ‘bad’

Label Expressions, Policies

Label expression 是一种逻辑表达式,它可以包含多个标签 (例如:big || virtual && !bad). Application Label expression 可以定义应用想要运行在哪些节点的集合 Queue Label expression 可以定义该队列“希望”应用运行在哪些节点。

Queue Label Policy

每个队列可以配置label expression和application Label Expression相互作用,通过配置Queue Label Policy可以解决Queue label和application label之间的冲突,决定应用在哪些类型节点上运行。

Label Manager

Label Manager是RM的一个新的服务 这个服务的主要作用为:

  • 从DFS加载节点的标签和维护内部节点和节点标签的map
  • 检查文件的变化,并更新内部节点和标签的映射关系
  • 基于 Application Label Expression, Queue Label Expression和Queue Label Policy结合构造新的逻辑表达式

英文不太好,望多多指正

参考资料: YARN-796