更新时间:2024-07-24 GMT+08:00

调整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将重新开始执行。

操作步骤

参数入口:

参考修改集群服务配置参数进入Yarn服务参数“全部配置”界面,在搜索框中输入参数名称。

表1 Preemption配置

参数

描述

默认值

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