Skip to content

Commit 79a4659

Browse files
YARN-10428. Zombie applications in the YARN queue using FAIR + sizebasedweight. Contributed by Guang Yang, Andras Gyori
1 parent 65857ea commit 79a4659

File tree

2 files changed

+46
-2
lines changed
  • hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src

2 files changed

+46
-2
lines changed

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/policy/FairOrderingPolicy.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,12 @@ public FairOrderingPolicy() {
100100
private double getMagnitude(SchedulableEntity r) {
101101
double mag = r.getSchedulingResourceUsage().getCachedUsed(
102102
CommonNodeLabelsManager.ANY).getMemorySize();
103-
if (sizeBasedWeight) {
103+
if (sizeBasedWeight && mag != 0) {
104104
double weight = Math.log1p(r.getSchedulingResourceUsage().getCachedDemand(
105105
CommonNodeLabelsManager.ANY).getMemorySize()) / Math.log(2);
106-
mag = mag / weight;
106+
if (weight != 0) {
107+
mag = mag / weight;
108+
}
107109
}
108110
return mag;
109111
}

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/policy/TestFairOrderingPolicy.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
import java.util.*;
2424

2525
import org.apache.hadoop.yarn.api.records.NodeId;
26+
import org.apache.hadoop.yarn.api.records.Priority;
2627
import org.apache.hadoop.yarn.conf.YarnConfiguration;
28+
import org.apache.hadoop.yarn.nodelabels.CommonNodeLabelsManager;
2729
import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
2830
import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmissionData;
2931
import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
@@ -346,4 +348,44 @@ public void testOrderingUsingAppDemand() {
346348
assertEquals("Comparator Output", 0,
347349
policy.getComparator().compare(r1, r2));
348350
}
351+
352+
@Test
353+
public void testRemoveEntitiesWithSizeBasedWeightAsCompletedJobs() {
354+
FairOrderingPolicy<MockSchedulableEntity> policy =
355+
new FairOrderingPolicy<MockSchedulableEntity>();
356+
policy.setSizeBasedWeight(true);
357+
358+
// Add 10 different schedulable entities
359+
List<MockSchedulableEntity> entities = new ArrayList<>(10);
360+
for (int i = 1; i <= 10; i++) {
361+
MockSchedulableEntity r = new MockSchedulableEntity();
362+
r.setApplicationPriority(Priority.newInstance(i));
363+
r.setUsed(Resources.createResource(4 * i));
364+
r.setPending(Resources.createResource(4 * i));
365+
AbstractComparatorOrderingPolicy.updateSchedulingResourceUsage(
366+
r.getSchedulingResourceUsage());
367+
policy.addSchedulableEntity(r);
368+
entities.add(r);
369+
}
370+
371+
// Mark the first 5 entities as completed by setting
372+
// the resources to 0
373+
for (int i = 0; i < 5; i++) {
374+
MockSchedulableEntity r = entities.get(i);
375+
r.getSchedulingResourceUsage().setCachedUsed(
376+
CommonNodeLabelsManager.ANY, Resources.createResource(0));
377+
r.getSchedulingResourceUsage().setCachedPending(
378+
CommonNodeLabelsManager.ANY, Resources.createResource(0));
379+
policy.entityRequiresReordering(r);
380+
}
381+
382+
policy.reorderScheduleEntities();
383+
384+
// Remove the first 5 elements
385+
for (int i = 0; i < 5; i++) {
386+
policy.removeSchedulableEntity(entities.get(i));
387+
}
388+
389+
Assert.assertEquals(5, policy.getNumSchedulableEntities());
390+
}
349391
}

0 commit comments

Comments
 (0)