Carlo Curino commented on YARN-2592:

Preemption is trying to enforce the scheduler invariants. One of which is how 
over-capacity is distributed among queues (weighted fairly on rightful 

I understand the desire to "protect" individual containers, and there will be 
many specific examples we can come up with in which killing a container is a 
pity as it loses some work (unless it handles the preemption message correctly 
and checkpoint its state), but long term I think enforcing the invariants is 
more important (fair and predictable for users). The opposite argument one can 
make is "why is queue B allowed to retain more over capacity than A?" if this 
happens systematically or for long period of time is unnerving for users as 
much as some lost work. 

Also note that preemption already has few built-in mechanisms (deadzones, and 
grace-periods) designed to limit the impact on running tasks, are we sure that 
proper tuning of capacity/max-capcity/dead-zones/grace-periods is not enough to 
remove 99% of the problem? This would be only an issue for long-running tasks 
(exceeding 2x the grace periods), when run above the capacity + dead-zone of a 
queue but within max-capacity. And only trigger, for a queue that is more over 
capacity than any other peer queue, when the peer queue also has over-capacity 
needs exceeding free space, AND no under-capacity queue is demanding the same 
resources.... we should make sure this is significant enough of a scenario in 
practice to justify complexity of new configurables.

I am definitely opposed to make this the default behavior, but I agree with 
Jason that we could add config parameters that allow to prevent preemption for 
over-capacity balancing. I feel though this is a slippery slope, which I think 
might lead to many loopholes (protecting AM being another one), that eventually 
will make configuring preemption and understanding what is happening for the 
users very hard. 

I think promoting proper handling of preemption on the app side (i.e., 
checkpoint your state, or redistributed your computation) is overall a 
healthier direction. 

My 2 cents..

> Preemption can kill containers to fulfil need of already over-capacity queue.
> -----------------------------------------------------------------------------
>                 Key: YARN-2592
>                 URL: https://issues.apache.org/jira/browse/YARN-2592
>             Project: Hadoop YARN
>          Issue Type: Bug
>    Affects Versions: 3.0.0, 2.5.1
>            Reporter: Eric Payne
> There are scenarios in which one over-capacity queue can cause preemption of 
> another over-capacity queue. However, since killing containers may lose work, 
> it doesn't make sense to me to kill containers to feed an already 
> over-capacity queue.
> Consider the following:
> {code}
> root has A,B,C, total capacity = 90
> A.guaranteed = 30, A.pending = 5, A.current = 40
> B.guaranteed = 30, B.pending = 0, B.current = 50
> C.guaranteed = 30, C.pending = 0, C.current = 0
> {code}
> In this case, the queue preemption monitor will kill 5 resources from queue B 
> so that queue A can pick them up, even though queue A is already over its 
> capacity. This could lose any work that those containers in B had already 
> done.
> Is there a use case for this behavior? It seems to me that if a queue is 
> already over its capacity, it shouldn't destroy the work of other queues. If 
> the over-capacity queue needs more resources, that seems to be a problem that 
> should be solved by increasing its guarantee.

This message was sent by Atlassian JIRA

Reply via email to