|
@@ -32,6 +32,7 @@ import org.apache.hadoop.yarn.api.records.ContainerId;
|
|
|
import org.apache.hadoop.yarn.api.records.ContainerState;
|
|
|
import org.apache.hadoop.yarn.api.records.ContainerStatus;
|
|
|
import org.apache.hadoop.yarn.api.records.NodeId;
|
|
|
+import org.apache.hadoop.yarn.api.records.ResourceBlacklistRequest;
|
|
|
import org.apache.hadoop.yarn.conf.YarnConfiguration;
|
|
|
import org.apache.hadoop.yarn.exceptions.YarnException;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.MockAM;
|
|
@@ -40,6 +41,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.NullRMNodeLabelsManager;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainerEventType;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainerState;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler;
|
|
@@ -721,6 +723,77 @@ public class TestCapacitySchedulerNodeLabelUpdate {
|
|
|
rm.close();
|
|
|
}
|
|
|
|
|
|
+ @Test(timeout = 30000)
|
|
|
+ public void testBlacklistAMDisableLabel() throws Exception {
|
|
|
+ conf.setBoolean(YarnConfiguration.AM_SCHEDULING_NODE_BLACKLISTING_ENABLED,
|
|
|
+ true);
|
|
|
+ conf.setFloat(
|
|
|
+ YarnConfiguration.AM_SCHEDULING_NODE_BLACKLISTING_DISABLE_THRESHOLD,
|
|
|
+ 0.5f);
|
|
|
+ mgr.addToCluserNodeLabelsWithDefaultExclusivity(ImmutableSet.of("x", "y"));
|
|
|
+ mgr.addLabelsToNode(ImmutableMap.of(NodeId.newInstance("h2", 0), toSet("x"),
|
|
|
+ NodeId.newInstance("h3", 0), toSet("x"), NodeId.newInstance("h6", 0),
|
|
|
+ toSet("x")));
|
|
|
+ mgr.addLabelsToNode(ImmutableMap.of(NodeId.newInstance("h4", 0), toSet("y"),
|
|
|
+ NodeId.newInstance("h5", 0), toSet("y"), NodeId.newInstance("h7", 0),
|
|
|
+ toSet("y")));
|
|
|
+
|
|
|
+ MockRM rm = new MockRM(getConfigurationWithQueueLabels(conf)) {
|
|
|
+ @Override
|
|
|
+ public RMNodeLabelsManager createNodeLabelManager() {
|
|
|
+ return mgr;
|
|
|
+ }
|
|
|
+ };
|
|
|
+ rm.getRMContext().setNodeLabelManager(mgr);
|
|
|
+ rm.start();
|
|
|
+ // Nodes in label default h1,h8,h9
|
|
|
+ // Nodes in label x h2,h3,h6
|
|
|
+ // Nodes in label y h4,h5,h7
|
|
|
+ MockNM nm1 = rm.registerNode("h1:1234", 2048);
|
|
|
+ MockNM nm2 = rm.registerNode("h2:1234", 2048);
|
|
|
+ rm.registerNode("h3:1234", 2048);
|
|
|
+ rm.registerNode("h4:1234", 2048);
|
|
|
+ rm.registerNode("h5:1234", 2048);
|
|
|
+ rm.registerNode("h6:1234", 2048);
|
|
|
+ rm.registerNode("h7:1234", 2048);
|
|
|
+ rm.registerNode("h8:1234", 2048);
|
|
|
+ rm.registerNode("h9:1234", 2048);
|
|
|
+
|
|
|
+ // Submit app with AM container launched on default partition i.e. h1.
|
|
|
+ RMApp app = rm.submitApp(GB, "app", "user", null, "a");
|
|
|
+ MockRM.launchAndRegisterAM(app, rm, nm1);
|
|
|
+ RMAppAttempt appAttempt = app.getCurrentAppAttempt();
|
|
|
+ // Add default node blacklist from default
|
|
|
+ appAttempt.getAMBlacklistManager().addNode("h1");
|
|
|
+ ResourceBlacklistRequest blacklistUpdates =
|
|
|
+ appAttempt.getAMBlacklistManager().getBlacklistUpdates();
|
|
|
+ Assert.assertEquals(1, blacklistUpdates.getBlacklistAdditions().size());
|
|
|
+ Assert.assertEquals(0, blacklistUpdates.getBlacklistRemovals().size());
|
|
|
+ // Adding second node from default parition
|
|
|
+ appAttempt.getAMBlacklistManager().addNode("h8");
|
|
|
+ blacklistUpdates = appAttempt.getAMBlacklistManager().getBlacklistUpdates();
|
|
|
+ Assert.assertEquals(0, blacklistUpdates.getBlacklistAdditions().size());
|
|
|
+ Assert.assertEquals(2, blacklistUpdates.getBlacklistRemovals().size());
|
|
|
+
|
|
|
+ // Submission in label x
|
|
|
+ RMApp applabel = rm.submitApp(GB, "app", "user", null, "a", "x");
|
|
|
+ MockRM.launchAndRegisterAM(applabel, rm, nm2);
|
|
|
+ RMAppAttempt appAttemptlabelx = applabel.getCurrentAppAttempt();
|
|
|
+ appAttemptlabelx.getAMBlacklistManager().addNode("h2");
|
|
|
+ ResourceBlacklistRequest blacklistUpdatesOnx =
|
|
|
+ appAttemptlabelx.getAMBlacklistManager().getBlacklistUpdates();
|
|
|
+ Assert.assertEquals(1, blacklistUpdatesOnx.getBlacklistAdditions().size());
|
|
|
+ Assert.assertEquals(0, blacklistUpdatesOnx.getBlacklistRemovals().size());
|
|
|
+ // Adding second node from default parition
|
|
|
+ appAttemptlabelx.getAMBlacklistManager().addNode("h3");
|
|
|
+ blacklistUpdatesOnx =
|
|
|
+ appAttempt.getAMBlacklistManager().getBlacklistUpdates();
|
|
|
+ Assert.assertEquals(0, blacklistUpdatesOnx.getBlacklistAdditions().size());
|
|
|
+ Assert.assertEquals(2, blacklistUpdatesOnx.getBlacklistRemovals().size());
|
|
|
+
|
|
|
+ rm.close();
|
|
|
+ }
|
|
|
+
|
|
|
private void checkAMResourceLimit(MockRM rm, String queuename, int memory,
|
|
|
String label) throws InterruptedException {
|
|
|
Assert.assertEquals(memory,
|