更新时间:2024-11-26 GMT+08:00
分享

调整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为权重):

    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>。

    被抢占的队列的资源如果CPU或内存中有一个资源满足minimum资源,就不会被其他队列抢占。

操作步骤

参数入口:

参考修改集群服务配置参数进入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

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

相关文档