[ 
https://issues.apache.org/jira/browse/SPARK-60914?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

ASF GitHub Bot updated SPARK-60914:
-----------------------------------
    Labels: pull-request-available  (was: )

> YarnAllocator never removes a recommissioned node from 
> decommissioningNodesCache, so a second decommissioning of the same node is 
> ignored
> -----------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: SPARK-60914
>                 URL: https://issues.apache.org/jira/browse/SPARK-60914
>             Project: Spark
>          Issue Type: Bug
>          Components: YARN
>    Affects Versions: 3.4.0, 3.5.0, 4.1.0, 4.0.0
>            Reporter: Norio Akagi
>            Priority: Minor
>              Labels: pull-request-available
>
> YarnAllocator keeps a \{{decommissioningNodesCache}} (added in SPARK-39018) 
> so that the driver is notified only once per node that enters the 
> DECOMMISSIONING state. Hosts are only ever added to the cache in 
> \{{handleNodesInDecommissioningState}}. Nothing removes them except LRU 
> eviction once the cache exceeds 200 entries.
> When a node is recommissioned, the RM reports it to the AM in 
> \{{AllocateResponse.getUpdatedNodes}} with state RUNNING (YARN-10538, Hadoop 
> 3.2.3 / 3.3.1 / 3.4.0+). YarnAllocator ignores every node state other than 
> DECOMMISSIONING, so the host stays in the cache after it is back to RUNNING.
> If YARN later allocates new containers on that host and the host is 
> decommissioned again, the DECOMMISSIONING report is filtered out by the stale 
> cache entry. \{{DecommissionExecutorsOnHost}} is never sent to the driver, 
> the new executors keep running tasks, and when the node is finally shut down 
> their tasks and shuffle data are lost without the graceful decommission that 
> \{{spark.decommission.enabled}} is supposed to provide.
> Sequence:
> # host1 is reported as DECOMMISSIONING. YarnAllocator sends 
> DecommissionExecutorsOnHost(host1) and adds host1 to the cache.
> # host1 is recommissioned. The RM reports host1 as RUNNING, YarnAllocator 
> ignores it. host1 remains in the cache.
> # YARN allocates new containers on host1 and executors start there.
> # host1 is reported as DECOMMISSIONING again. The report is dropped because 
> host1 is already in the cache. The executors from step 3 are never 
> decommissioned.
> This is easy to hit on clusters where the same hostname goes through 
> decommission and recommission repeatedly, for example autoscaling setups that 
> cancel a scale-in.
> Proposed fix: in \{{handleNodesInDecommissioningState}}, also look at RUNNING 
> node reports and remove the host from \{{decommissioningNodesCache}}. A unit 
> test that replays the sequence above against YarnAllocator fails on current 
> master at step 4 ("Wanted 2 times, but was 1 time") and passes with the fix.
> References:
> * Original implementation: SPARK-39018, 
> https://github.com/apache/spark/pull/35683
> * RM side notification on recommission: YARN-10538



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to