容器放置约束

目前的约束是硬限制,如果不满足,则容器请求会被pending或者rejected。

我们用allocation这个概念指代资源的一个单位,即一个容器。

如果需要开启放置约束,我们需要修改conf/yarn-site.xml的如下配置:

yarn.resoucemanager.placement-constraints.handler:指定哪个处理器用于处理PlacementConstrains,可以使用的有:placement-processor,scheduler,disabled。

placement-processor:如果使用放置处理器,则被认为是调度器被调用前的一个前置操作。一旦放置被决定后,调度器被调起去执行真正的分配。这个处理器的好处是支持各种约束(affinity, anti-affinity, cardinality)。因为独立于调度器,所以它可以被多个调度器调用。

scheduler: 直接使用调度器作为处理器,目前,只有容量调度器支持SchedulingRequests。支持反亲和性约束。is that it follows the same ordering rules for queues (sorted by utilization, priority), apps (sorted by FIFO/fairness/priority) and tasks within the same app (priority) that are enforced by the existing main scheduler。

disabled:如果使用了SchedulingRequest,则会被拒绝。

placement-processor支持分为更广泛的约束和一次申请多个容器。然而,如果应用优先级对于用户很重要,或者使用了容量调度器,则应该使用scheduler。

使用分布式shell实验放置约束。


$ yarn org.apache.hadoop.yarn.applications.distributedshell.Client -jar share/hadoop/yarn/hadoop-yarn-applications-distributedshell-3.1.1.jar -shell_command sleep -shell_args 10 -placement_spec PlacementSpec


PlacementSpec         => "" | KeyVal;PlacementSpec
KeyVal                => SourceTag=ConstraintExpr
SourceTag             => String
ConstraintExpr        => NumContainers | NumContainers, Constraint
Constraint            => SingleConstraint | CompositeConstraint
SingleConstraint      => "IN",Scope,TargetTag | "NOTIN",Scope,TargetTag | "CARDINALITY",Scope,TargetTag,MinCard,MaxCard
CompositeConstraint   => AND(ConstraintList) | OR(ConstraintList)
ConstraintList        => Constraint | Constraint:ConstraintList
NumContainers         => int
Scope                 => "NODE" | "RACK"
TargetTag             => String
MinCard               => int
MaxCard               => int

如果-num-containers和-placement-spec被组合使用,则former被忽略。

例如:


zk=3,NOTIN,NODE,zk:hbase=5,IN,RACK,zk:spark=7,CARDINALITY,NODE,hbase,1,3


zk=5,AND(IN,RACK,hbase:NOTIN,NODE,zk)


定义放置约束。

Allocation tags

分配标识是一个字符串标识,可以关联一组容器。我们不使用ResourceRequest对象去定义分配标识,使用SchedulilngRequest对象。SchedulilngRequest跟ResourceRequest很像,但是更好的分离了数量,分配大小,优先级,执行类型等,并且约束自述这些分配应该如何被放置(资源名称,局部松弛)。应用可以使用ResourceRequest对象,但是为了去定义分配标识和约束,需要使用SchedulingRequest对象。在一个单个分配请求中,应用使用这两种中的任意一种,而不是都使用。

Allocation tags namespace

我们使用分配标识命名空间去指定分配标识可以引用的应用范围。

我们当前支持下列命名空间:

SELF:默认命令空间,tag引用当前应用的容器。

NOT_SELF:tag引用不属于当前应用的容器。

ALL:tag引用任意容器。

APP_ID:tag引用指定app_id的应用的容器。

APP_TAG:tag引用指定tag的应用的容器。

默认ns是SELF,用于intra-app约束,剩余的ns用于inter-app约束。如果不指定ns,则使用SELF。

上面的例子使用命名空间的写法如下:


zk=3,NOTIN,NODE,not-self/zk:hbase=5,IN,RACK,all/zk:spark=7,CARDINALITY,NODE,app-id/appID_0023/hbase,1,3


node labels, node attributes, allocation tags之间的不同。

分配标识附加到分配而不是节点。节点会继承当前分配到节点的分配,机架会继承节点的tags。

在应用中指定约束