
# 调整Yarn任务抢占机制
#### 操作场景
抢占任务可精简队列中的job运行并提高资源利用率，由ResourceManager的capacity scheduler实现，其简易流程如下：
1. 假设存在两个队列A和B。其中队列A的capacity为25%，队列B的capacity为75%。
2. 初始状态下，任务1发送给队列A，此任务需要75%的集群资源。之后任务2发送到了队列B，此任务需要50%的集群资源。
3. 任务1将会使用队列A提供的25%的集群资源，并从队列B获取的50%的集群资源。队列B保留25%的集群资源。
4. 启用抢占任务特性，则任务1使用的资源将会被抢占。队列B会从队列A中获取25%的集群资源以满足任务2的执行。
5. 当任务2完成后，集群中存在足够的资源时，任务1将重新开始执行。
 
#### 操作步骤
参数入口：
参考[修改集群服务配置参数](https://support.huaweicloud.com/cmpntguide-mrs/mrs_01_2125.html)进入Yarn服务参数"全部配置"界面，在搜索框中输入参数名称。
表1Preemption配置 
| **参数**                                                                      | **描述**                                                                                                                                                                                                                                                                                                                         | **默认值**                                                                                             |
|:---|:---|:---|
| yarn.resourcemanager.scheduler.monitor.enable                               | 根据"yarn.resourcemanager.scheduler.monitor.policies"中的策略，启用新的scheduler监控。设置为"true"表示启用监控，并根据scheduler的信息，启动抢占的功能。设置为"false"表示不启用。                                                                                                                                                                                               | false                                                                                               |
| yarn.resourcemanager.scheduler.monitor.policies                             | 设置与scheduler配合的"SchedulingEditPolicy"的类的清单。                                                                                                                                                                                                                                                                                    | org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity.ProportionalCapacityPreemptionPolicy |
| yarn.resourcemanager.monitor.capacity.preemption.observe_only               | - 设置为"true"，则执行策略，但是不对集群资源进程抢占操作。  - 设置为"false"，则执行策略，且根据策略启用集群资源抢占的功能。   | false                                                                                               |
| yarn.resourcemanager.monitor.capacity.preemption.monitoring_interval        | 根据策略监控的时间间隔，单位为毫秒。如果将该参数设置为更大的值，容量检测将不那么频繁地运行。                                                                                                                                                                                                                                                                                 | 3000                                                                                                |
| yarn.resourcemanager.monitor.capacity.preemption.max_wait_before_kill       | 应用发送抢占需求到停止container（释放资源）的时间间隔，单位为毫秒。取值范围大于等于0。 默认情况下，若ApplicationMaster15秒内没有终止container，ResourceManager等待15秒后会强制终止。                                                                                                                                                        | 15000                                                                                               |
| yarn.resourcemanager.monitor.capacity.preemption.total_preemption_per_round | 在一个周期内能够抢占资源的最大的比例。可使用这个值来限制从集群回收容器的速度。计算出了期望的总抢占值之后，策略会伸缩回这个限制。                                                                                                                                                                                                                                                               | 0.1                                                                                                 |
| yarn.resourcemanager.monitor.capacity.preemption.max_ignored_over_capacity  | 集群中资源总量乘以此配置项的值加上某个队列（例如队列A）原有的资源量为资源抢占盲区。当队列A中的任务实际使用的资源超过该抢占盲区时，超过部分的资源将会被抢占。取值范围：0\~1。 说明： 设置的值越小越有利于资源抢占。                                                                                                                | 0                                                                                                   |
| yarn.resourcemanager.monitor.capacity.preemption.natural_termination_factor | 设置抢占目标，Container只会抢占所配置比例的资源。 示例，如果设置为0.5，则在5\*"yarn.resourcemanager.monitor.capacity.preemption.max_wait_before_kill"的时间内，任务会回收所抢占资源的近95%。即接连抢占5次，每次抢占待抢占资源的0.5，呈几何收敛，每次的时间间隔为"yarn.resourcemanager.monitor.capacity.preemption.max_wait_before_kill"。取值范围：0\~1。             | 1                                                                                                   |
   
