YARN-2389. Added functionality for schedulers to kill all applications in a queue. Contributed by Subramaniam Venkatraman Krishnan
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1618294 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
ddf108449d
commit
c3084d6c16
|
@ -140,6 +140,9 @@ Release 2.6.0 - UNRELEASED
|
|||
YARN-1370. Fair scheduler to re-populate container allocation state.
|
||||
(Anubhav Dhoot via kasha)
|
||||
|
||||
YARN-2389. Added functionality for schedulers to kill all applications in a
|
||||
queue. (Subramaniam Venkatraman Krishnan via jianhe)
|
||||
|
||||
OPTIMIZATIONS
|
||||
|
||||
BUG FIXES
|
||||
|
|
|
@ -41,6 +41,8 @@ import org.apache.hadoop.yarn.exceptions.YarnException;
|
|||
import org.apache.hadoop.yarn.server.api.protocolrecords.NMContainerStatus;
|
||||
import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
|
||||
import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
|
||||
import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppEvent;
|
||||
import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppEventType;
|
||||
import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppMoveEvent;
|
||||
import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt;
|
||||
import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainer;
|
||||
|
@ -348,4 +350,23 @@ public abstract class AbstractYarnScheduler
|
|||
.handle(new RMAppMoveEvent(app.getApplicationId(), destQueue, future));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void killAllAppsInQueue(String queueName)
|
||||
throws YarnException {
|
||||
// check if queue is a valid
|
||||
List<ApplicationAttemptId> apps = getAppsInQueue(queueName);
|
||||
if (apps == null) {
|
||||
String errMsg = "The specified Queue: " + queueName + " doesn't exist";
|
||||
LOG.warn(errMsg);
|
||||
throw new YarnException(errMsg);
|
||||
}
|
||||
// generate kill events for each pending/running app
|
||||
for (ApplicationAttemptId app : apps) {
|
||||
this.rmContext
|
||||
.getDispatcher()
|
||||
.getEventHandler()
|
||||
.handle(new RMAppEvent(app.getApplicationId(), RMAppEventType.KILL));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -212,4 +212,12 @@ public interface YarnScheduler extends EventHandler<SchedulerEvent> {
|
|||
* @throws YarnException
|
||||
*/
|
||||
void moveAllApps(String sourceQueue, String destQueue) throws YarnException;
|
||||
|
||||
/**
|
||||
* Terminate all applications in the specified queue.
|
||||
*
|
||||
* @param queueName the name of queue to be drained
|
||||
* @throws YarnException
|
||||
*/
|
||||
void killAllAppsInQueue(String queueName) throws YarnException;
|
||||
}
|
||||
|
|
|
@ -1074,11 +1074,10 @@ public class TestCapacityScheduler {
|
|||
queue =
|
||||
scheduler.getApplicationAttempt(appsInB1.get(0)).getQueue()
|
||||
.getQueueName();
|
||||
System.out.println(queue);
|
||||
Assert.assertTrue(queue.equals("b1"));
|
||||
|
||||
appsInB = scheduler.getAppsInQueue("b");
|
||||
assertTrue(appsInA.contains(appAttemptId));
|
||||
assertTrue(appsInB.contains(appAttemptId));
|
||||
assertEquals(1, appsInB.size());
|
||||
|
||||
appsInRoot = scheduler.getAppsInQueue("root");
|
||||
|
@ -1140,6 +1139,7 @@ public class TestCapacityScheduler {
|
|||
assertTrue(appsInA1.isEmpty());
|
||||
|
||||
appsInA = scheduler.getAppsInQueue("a");
|
||||
assertTrue(appsInA.contains(appAttemptId));
|
||||
assertEquals(1, appsInA.size());
|
||||
|
||||
appsInRoot = scheduler.getAppsInQueue("root");
|
||||
|
@ -1664,7 +1664,7 @@ public class TestCapacityScheduler {
|
|||
Assert.assertTrue(queue.equals("b1"));
|
||||
|
||||
appsInB = scheduler.getAppsInQueue("b");
|
||||
assertTrue(appsInA.contains(appAttemptId));
|
||||
assertTrue(appsInB.contains(appAttemptId));
|
||||
assertEquals(1, appsInB.size());
|
||||
|
||||
appsInRoot = scheduler.getAppsInQueue("root");
|
||||
|
@ -1798,4 +1798,96 @@ public class TestCapacityScheduler {
|
|||
rm.stop();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testKillAllAppsInQueue() throws Exception {
|
||||
MockRM rm = setUpMove();
|
||||
AbstractYarnScheduler scheduler =
|
||||
(AbstractYarnScheduler) rm.getResourceScheduler();
|
||||
|
||||
// submit an app
|
||||
RMApp app = rm.submitApp(GB, "test-move-1", "user_0", null, "a1");
|
||||
ApplicationAttemptId appAttemptId =
|
||||
rm.getApplicationReport(app.getApplicationId())
|
||||
.getCurrentApplicationAttemptId();
|
||||
|
||||
// check preconditions
|
||||
List<ApplicationAttemptId> appsInA1 = scheduler.getAppsInQueue("a1");
|
||||
assertEquals(1, appsInA1.size());
|
||||
|
||||
List<ApplicationAttemptId> appsInA = scheduler.getAppsInQueue("a");
|
||||
assertTrue(appsInA.contains(appAttemptId));
|
||||
assertEquals(1, appsInA.size());
|
||||
String queue =
|
||||
scheduler.getApplicationAttempt(appsInA1.get(0)).getQueue()
|
||||
.getQueueName();
|
||||
Assert.assertTrue(queue.equals("a1"));
|
||||
|
||||
List<ApplicationAttemptId> appsInRoot = scheduler.getAppsInQueue("root");
|
||||
assertTrue(appsInRoot.contains(appAttemptId));
|
||||
assertEquals(1, appsInRoot.size());
|
||||
|
||||
// now kill the app
|
||||
scheduler.killAllAppsInQueue("a1");
|
||||
|
||||
// check postconditions
|
||||
rm.waitForState(app.getApplicationId(), RMAppState.KILLED);
|
||||
appsInRoot = scheduler.getAppsInQueue("root");
|
||||
assertTrue(appsInRoot.isEmpty());
|
||||
|
||||
appsInA1 = scheduler.getAppsInQueue("a1");
|
||||
assertTrue(appsInA1.isEmpty());
|
||||
|
||||
appsInA = scheduler.getAppsInQueue("a");
|
||||
assertTrue(appsInA.isEmpty());
|
||||
|
||||
rm.stop();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testKillAllAppsInvalidSource() throws Exception {
|
||||
MockRM rm = setUpMove();
|
||||
AbstractYarnScheduler scheduler =
|
||||
(AbstractYarnScheduler) rm.getResourceScheduler();
|
||||
|
||||
// submit an app
|
||||
RMApp app = rm.submitApp(GB, "test-move-1", "user_0", null, "a1");
|
||||
ApplicationAttemptId appAttemptId =
|
||||
rm.getApplicationReport(app.getApplicationId())
|
||||
.getCurrentApplicationAttemptId();
|
||||
|
||||
// check preconditions
|
||||
List<ApplicationAttemptId> appsInA1 = scheduler.getAppsInQueue("a1");
|
||||
assertEquals(1, appsInA1.size());
|
||||
|
||||
List<ApplicationAttemptId> appsInA = scheduler.getAppsInQueue("a");
|
||||
assertTrue(appsInA.contains(appAttemptId));
|
||||
assertEquals(1, appsInA.size());
|
||||
|
||||
List<ApplicationAttemptId> appsInRoot = scheduler.getAppsInQueue("root");
|
||||
assertTrue(appsInRoot.contains(appAttemptId));
|
||||
assertEquals(1, appsInRoot.size());
|
||||
|
||||
// now kill the app
|
||||
try {
|
||||
scheduler.killAllAppsInQueue("DOES_NOT_EXIST");
|
||||
Assert.fail();
|
||||
} catch (YarnException e) {
|
||||
// expected
|
||||
}
|
||||
|
||||
// check postconditions, app should still be in a1
|
||||
appsInA1 = scheduler.getAppsInQueue("a1");
|
||||
assertEquals(1, appsInA1.size());
|
||||
|
||||
appsInA = scheduler.getAppsInQueue("a");
|
||||
assertTrue(appsInA.contains(appAttemptId));
|
||||
assertEquals(1, appsInA.size());
|
||||
|
||||
appsInRoot = scheduler.getAppsInQueue("root");
|
||||
assertTrue(appsInRoot.contains(appAttemptId));
|
||||
assertEquals(1, appsInRoot.size());
|
||||
|
||||
rm.stop();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue