
# 调整Yarn任务抢占机制
#### 操作场景
- **Capacity调度器抢占原理** ：
  抢占任务可精简队列中的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将重新执行。
   
- **Superior 调度器抢占原理**
  在资源充足时，Superior Scheduler允许队列使用超出queue policy中配置（minimum, share）的资源，提高集群的资源利用率。但在资源不足时，为了保证公平，就需要抢占来保证在queue policy承诺的队列minimum资源。队列资源信息如下（其中，minimum为最小资源，share为权重）：
  ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002061271784.png)
  1. 用户A，提交作业1到queue1，AM使用\<vcore 1, memory 2GB\>，8个任务，每个任务使用\<vcore 2, memory 4 GB\>。资源足够，作业1顺利运行。queue1使用了\<vcore 17, memory 34G\>。此时集群还剩资源\<vcore 23, memory 6GB\>。
  
  2. 用户B，提交作业2到queue2，AM使用\<core 1, memory 2GB\>，5个任务，每个任务使用\<vcore 2, memory 4GB\>。在抢占触发前，作业2的AM和一个任务可以顺利运行。queue2使用了\<vcore 3, memory 6GB\>。此时集群还剩资源\<vcore 20, memory 0GB\>。
  
  3. 因为queue2还未使用到minimum保障的资源，并且还有任务等待执行，所以此时Scheduler触发抢占，回收一个作业1的任务，作业2可以利用抢占回来的资源再运行1个任务，queue2使用了\<vcore 5, memory 10GB\>。
  
  
  ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
  被抢占的队列的资源如果CPU或内存中有一个资源满足minimum资源，就不会被其他队列抢占。
  
 
#### 操作步骤
参数入口：
参考[修改集群服务配置参数](https://support.huaweicloud.com/cmpntguide-lts-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                                                                                                   |
| ss.engine.scheduler.preemption-enable                                       | 是否开启Superior调度器抢占。                                                                                                                                                                                                                                                                                                             | false                                                                                               |
| ss.engine.scheduler.preemption-interval-ms                                  | 触发抢占的最短时间间隔（即抢占周期），单位：毫秒。                                                                                                                                                                                                                                                                                                      | 3000                                                                                                |
| ss.engine.scheduler.preemption-max-per-interval                             | 在一个抢占周期内能抢占Yarn容器的最大数量。 默认值为-1，即无限制。                                                                                                                                                                                                                                                            | -1                                                                                                  |
| ss.engine.scheduler.preemption-warn-period-ms                               | 通知Application Master要被抢占的时间。如果被通知的Application Master在这个时间内未释放借到的资源，那么使用这部分资源运行的Yarn容器会被Resource Manager强制终止。单位：毫秒。                                                                                                                                                                                                             | 10000                                                                                               |
   
