调整Yarn任务抢占机制
操作场景
- Capacity调度器抢占原理:
抢占任务可精简队列中的job运行并提高资源利用率,由ResourceManager的capacity scheduler实现,其简易流程如下:
- 假设存在两个队列A和B。其中队列A的capacity为25%,队列B的capacity为75%。
- 初始状态下,任务1发送给队列A,此任务需要75%的集群资源。之后任务2发送到了队列B,此任务需要50%的集群资源。
- 任务1将会使用队列A提供的25%的集群资源,并从队列B获取的50%的集群资源。队列B保留25%的集群资源。
- 启用抢占任务特性,则任务1使用的资源将会被抢占。队列B会从队列A中获取25%的集群资源以满足任务2的执行。
- 当任务2完成后,集群中存在足够的资源时,任务1将重新执行。
- Superior 调度器抢占原理
在资源充足时,Superior Scheduler允许队列使用超出queue policy中配置(minimum, share)的资源,提高集群的资源利用率。但在资源不足时,为了保证公平,就需要抢占来保证在queue policy承诺的队列minimum资源。队列资源信息如下(其中,minimum为最小资源,share为权重):
- 用户A,提交作业1到queue1,AM使用<vcore 1, memory 2GB>,8个任务,每个任务使用<vcore 2, memory 4 GB>。资源足够,作业1顺利运行。queue1使用了<vcore 17, memory 34G>。此时集群还剩资源<vcore 23, memory 6GB>。
- 用户B,提交作业2到queue2,AM使用<core 1, memory 2GB>,5个任务,每个任务使用<vcore 2, memory 4GB>。在抢占触发前,作业2的AM和一个任务可以顺利运行。queue2使用了<vcore 3, memory 6GB>。此时集群还剩资源<vcore 20, memory 0GB>。
- 因为queue2还未使用到minimum保障的资源,并且还有任务等待执行,所以此时Scheduler触发抢占,回收一个作业1的任务,作业2可以利用抢占回来的资源再运行1个任务,queue2使用了<vcore 5, memory 10GB>。
被抢占的队列的资源如果CPU或内存中有一个资源满足minimum资源,就不会被其他队列抢占。
操作步骤
参数入口:
参考修改集群服务配置参数进入Yarn服务参数“全部配置”界面,在搜索框中输入参数名称。
参数 |
描述 |
默认值 |
---|---|---|
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 |
|
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 |