目标:
- 提供一种可靠的机制在特定的节点运行应用程序。
- 为队列提供一种可靠的机制在特定的节点上进行资源的调度
- 提供一种机制解决队列和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