YARN-2539. FairScheduler: Set the default value for maxAMShare to 0.5. (Wei Yan via kasha)

(cherry picked from commit 43efdd30b5)
This commit is contained in:
Karthik Kambatla 2014-09-22 16:09:52 -07:00
parent 24a814771e
commit 3984435661
5 changed files with 23 additions and 18 deletions

View File

@ -211,6 +211,9 @@ Release 2.6.0 - UNRELEASED
YARN-1372. Ensure all completed containers are reported to the AMs across YARN-1372. Ensure all completed containers are reported to the AMs across
RM restart. (Anubhav Dhoot via jianhe) RM restart. (Anubhav Dhoot via jianhe)
YARN-2539. FairScheduler: Set the default value for maxAMShare to 0.5.
(Wei Yan via kasha)
OPTIMIZATIONS OPTIMIZATIONS
BUG FIXES BUG FIXES

View File

@ -130,7 +130,7 @@ public AllocationConfiguration(Configuration conf) {
queueMaxAMShares = new HashMap<String, Float>(); queueMaxAMShares = new HashMap<String, Float>();
userMaxAppsDefault = Integer.MAX_VALUE; userMaxAppsDefault = Integer.MAX_VALUE;
queueMaxAppsDefault = Integer.MAX_VALUE; queueMaxAppsDefault = Integer.MAX_VALUE;
queueMaxAMShareDefault = -1.0f; queueMaxAMShareDefault = 0.5f;
queueAcls = new HashMap<String, Map<QueueACL, AccessControlList>>(); queueAcls = new HashMap<String, Map<QueueACL, AccessControlList>>();
minSharePreemptionTimeouts = new HashMap<String, Long>(); minSharePreemptionTimeouts = new HashMap<String, Long>();
fairSharePreemptionTimeouts = new HashMap<String, Long>(); fairSharePreemptionTimeouts = new HashMap<String, Long>();

View File

@ -224,7 +224,7 @@ public synchronized void reloadAllocations() throws IOException,
new HashMap<String, Map<QueueACL, AccessControlList>>(); new HashMap<String, Map<QueueACL, AccessControlList>>();
int userMaxAppsDefault = Integer.MAX_VALUE; int userMaxAppsDefault = Integer.MAX_VALUE;
int queueMaxAppsDefault = Integer.MAX_VALUE; int queueMaxAppsDefault = Integer.MAX_VALUE;
float queueMaxAMShareDefault = -1.0f; float queueMaxAMShareDefault = 0.5f;
long defaultFairSharePreemptionTimeout = Long.MAX_VALUE; long defaultFairSharePreemptionTimeout = Long.MAX_VALUE;
long defaultMinSharePreemptionTimeout = Long.MAX_VALUE; long defaultMinSharePreemptionTimeout = Long.MAX_VALUE;
float defaultFairSharePreemptionThreshold = 0.5f; float defaultFairSharePreemptionThreshold = 0.5f;

View File

@ -3128,7 +3128,7 @@ public void testQueueMaxAMShareDefault() throws Exception {
out.println("<queue name=\"queue1\">"); out.println("<queue name=\"queue1\">");
out.println("</queue>"); out.println("</queue>");
out.println("<queue name=\"queue2\">"); out.println("<queue name=\"queue2\">");
out.println("<maxAMShare>1.0</maxAMShare>"); out.println("<maxAMShare>0.4</maxAMShare>");
out.println("</queue>"); out.println("</queue>");
out.println("<queue name=\"queue3\">"); out.println("<queue name=\"queue3\">");
out.println("</queue>"); out.println("</queue>");
@ -3172,40 +3172,42 @@ public void testQueueMaxAMShareDefault() throws Exception {
assertEquals("Queue queue5's fair share should be 0", 0, queue5 assertEquals("Queue queue5's fair share should be 0", 0, queue5
.getFairShare().getMemory()); .getFairShare().getMemory());
List<String> queues = Arrays.asList("root.default", "root.queue3", List<String> queues = Arrays.asList("root.queue3", "root.queue4",
"root.queue4", "root.queue5"); "root.queue5");
for (String queue : queues) { for (String queue : queues) {
createSchedulingRequest(1 * 1024, queue, "user1"); createSchedulingRequest(1 * 1024, queue, "user1");
scheduler.update(); scheduler.update();
scheduler.handle(updateEvent); scheduler.handle(updateEvent);
} }
Resource amResource1 = Resource.newInstance(2048, 1); Resource amResource1 = Resource.newInstance(1024, 1);
int amPriority = RMAppAttemptImpl.AM_CONTAINER_PRIORITY.getPriority(); int amPriority = RMAppAttemptImpl.AM_CONTAINER_PRIORITY.getPriority();
// Exceeds queue limit, but default maxAMShare is -1.0 so it doesn't matter // The fair share is 2048 MB, and the default maxAMShare is 0.5f,
// so the AM is accepted.
ApplicationAttemptId attId1 = createAppAttemptId(1, 1); ApplicationAttemptId attId1 = createAppAttemptId(1, 1);
createApplicationWithAMResource(attId1, "queue1", "test1", amResource1); createApplicationWithAMResource(attId1, "queue1", "test1", amResource1);
createSchedulingRequestExistingApplication(2048, 1, amPriority, attId1); createSchedulingRequestExistingApplication(1024, 1, amPriority, attId1);
FSAppAttempt app1 = scheduler.getSchedulerApp(attId1); FSAppAttempt app1 = scheduler.getSchedulerApp(attId1);
scheduler.update(); scheduler.update();
scheduler.handle(updateEvent); scheduler.handle(updateEvent);
assertEquals("Application1's AM requests 2048 MB memory", assertEquals("Application1's AM requests 1024 MB memory",
2048, app1.getAMResource().getMemory()); 1024, app1.getAMResource().getMemory());
assertEquals("Application1's AM should be running", assertEquals("Application1's AM should be running",
1, app1.getLiveContainers().size()); 1, app1.getLiveContainers().size());
assertEquals("Queue1's AM resource usage should be 2048 MB memory", assertEquals("Queue1's AM resource usage should be 1024 MB memory",
2048, queue1.getAmResourceUsage().getMemory()); 1024, queue1.getAmResourceUsage().getMemory());
// Exceeds queue limit, and maxAMShare is 1.0 // Now the fair share is 1639 MB, and the maxAMShare is 0.4f,
// so the AM is not accepted.
ApplicationAttemptId attId2 = createAppAttemptId(2, 1); ApplicationAttemptId attId2 = createAppAttemptId(2, 1);
createApplicationWithAMResource(attId2, "queue2", "test1", amResource1); createApplicationWithAMResource(attId2, "queue2", "test1", amResource1);
createSchedulingRequestExistingApplication(2048, 1, amPriority, attId2); createSchedulingRequestExistingApplication(1024, 1, amPriority, attId2);
FSAppAttempt app2 = scheduler.getSchedulerApp(attId2); FSAppAttempt app2 = scheduler.getSchedulerApp(attId2);
scheduler.update(); scheduler.update();
scheduler.handle(updateEvent); scheduler.handle(updateEvent);
assertEquals("Application2's AM requests 2048 MB memory", assertEquals("Application2's AM requests 1024 MB memory",
2048, app2.getAMResource().getMemory()); 1024, app2.getAMResource().getMemory());
assertEquals("Application2's AM should not be running", assertEquals("Application2's AM should not be running",
0, app2.getLiveContainers().size()); 0, app2.getLiveContainers().size());
assertEquals("Queue2's AM resource usage should be 0 MB memory", assertEquals("Queue2's AM resource usage should be 0 MB memory",

View File

@ -246,8 +246,8 @@ Allocation file format
* maxAMShare: limit the fraction of the queue's fair share that can be used * maxAMShare: limit the fraction of the queue's fair share that can be used
to run application masters. This property can only be used for leaf queues. to run application masters. This property can only be used for leaf queues.
For example, if set to 1.0f, then AMs in the leaf queue can take up to 100% For example, if set to 1.0f, then AMs in the leaf queue can take up to 100%
of both the memory and CPU fair share. The default value is -1.0f, which of both the memory and CPU fair share. The value of -1.0f will disable
means that this check is disabled. this feature and the amShare will not be checked. The default value is 0.5f.
* weight: to share the cluster non-proportionally with other queues. Weights * weight: to share the cluster non-proportionally with other queues. Weights
default to 1, and a queue with weight 2 should receive approximately twice default to 1, and a queue with weight 2 should receive approximately twice