Пример #1
0
 /// <exception cref="System.Exception"/>
 public CSAssignment Answer(InvocationOnMock invocation)
 {
     try
     {
         throw new Exception();
     }
     catch (Exception)
     {
         TestChildQueueOrder.Log.Info("FOOBAR q.assignContainers q=" + queue.GetQueueName(
                                          ) + " alloc=" + allocation + " node=" + node.GetNodeName());
     }
     Org.Apache.Hadoop.Yarn.Api.Records.Resource allocatedResource = Resources.CreateResource
                                                                         (allocation);
     if (queue is ParentQueue)
     {
         ((ParentQueue)queue).AllocateResource(clusterResource, allocatedResource, null);
     }
     else
     {
         FiCaSchedulerApp app1 = this._enclosing.GetMockApplication(0, string.Empty);
         ((LeafQueue)queue).AllocateResource(clusterResource, app1, allocatedResource, null
                                             );
     }
     if (allocation > 0)
     {
         Org.Mockito.Mockito.DoReturn(new CSAssignment(Resources.None(), type)).When(queue
                                                                                     ).AssignContainers(Matchers.Eq(clusterResource), Matchers.Eq(node), Matchers.Any
                                                                                                        <ResourceLimits>());
         Org.Apache.Hadoop.Yarn.Api.Records.Resource available = node.GetAvailableResource
                                                                     ();
         Org.Mockito.Mockito.DoReturn(Resources.SubtractFrom(available, allocatedResource)
                                      ).When(node).GetAvailableResource();
     }
     return(new CSAssignment(allocatedResource, type));
 }
Пример #2
0
 public CSAssignment(Resource resource, NodeType type)
 {
     this.resource          = resource;
     this.type              = type;
     this.application       = null;
     this.excessReservation = null;
     this.skipped           = false;
 }
Пример #3
0
 public CSAssignment(FiCaSchedulerApp application, RMContainer excessReservation)
 {
     this.resource          = excessReservation.GetContainer().GetResource();
     this.type              = NodeType.NodeLocal;
     this.application       = application;
     this.excessReservation = excessReservation;
     this.skipped           = false;
 }
Пример #4
0
 public CSAssignment(bool skipped)
 {
     this.resource          = Resources.CreateResource(0, 0);
     this.type              = NodeType.NodeLocal;
     this.application       = null;
     this.excessReservation = null;
     this.skipped           = skipped;
 }
Пример #5
0
        private FiCaSchedulerApp GetMockApplication(int appId, string user)
        {
            FiCaSchedulerApp application = Org.Mockito.Mockito.Mock <FiCaSchedulerApp>();

            Org.Mockito.Mockito.DoReturn(user).When(application).GetUser();
            Org.Mockito.Mockito.DoReturn(Resources.CreateResource(0, 0)).When(application).GetHeadroom
                ();
            return(application);
        }
 public CapacityHeadroomProvider(LeafQueue.User user, LeafQueue queue, FiCaSchedulerApp
                                 application, Resource required, LeafQueue.QueueResourceLimitsInfo queueResourceLimitsInfo
                                 )
 {
     this.user                    = user;
     this.queue                   = queue;
     this.application             = application;
     this.required                = required;
     this.queueResourceLimitsInfo = queueResourceLimitsInfo;
 }
Пример #7
0
        public static ContainerId GetMockContainerId(FiCaSchedulerApp application)
        {
            ContainerId containerId = Org.Mockito.Mockito.Mock <ContainerId>();

            Org.Mockito.Mockito.DoReturn(application.GetApplicationAttemptId()).When(containerId
                                                                                     ).GetApplicationAttemptId();
            long id = application.GetNewContainerId();

            Org.Mockito.Mockito.DoReturn((int)id).When(containerId).GetId();
            Org.Mockito.Mockito.DoReturn(id).When(containerId).GetContainerId();
            return(containerId);
        }
Пример #8
0
        private FiCaSchedulerApp GetMockApplication(int appId, string user, Org.Apache.Hadoop.Yarn.Api.Records.Resource
                                                    amResource)
        {
            FiCaSchedulerApp     application          = Org.Mockito.Mockito.Mock <FiCaSchedulerApp>();
            ApplicationAttemptId applicationAttemptId = TestUtils.GetMockApplicationAttemptId
                                                            (appId, 0);

            Org.Mockito.Mockito.DoReturn(applicationAttemptId.GetApplicationId()).When(application
                                                                                       ).GetApplicationId();
            Org.Mockito.Mockito.DoReturn(applicationAttemptId).When(application).GetApplicationAttemptId
                ();
            Org.Mockito.Mockito.DoReturn(user).When(application).GetUser();
            Org.Mockito.Mockito.DoReturn(amResource).When(application).GetAMResource();
            return(application);
        }
Пример #9
0
 public override void CompletedContainer(Org.Apache.Hadoop.Yarn.Api.Records.Resource
                                         clusterResource, FiCaSchedulerApp application, FiCaSchedulerNode node, RMContainer
                                         rmContainer, ContainerStatus containerStatus, RMContainerEventType @event, CSQueue
                                         completedChildQueue, bool sortQueues)
 {
     if (application != null)
     {
         // Careful! Locking order is important!
         // Book keeping
         lock (this)
         {
             base.ReleaseResource(clusterResource, rmContainer.GetContainer().GetResource(), node
                                  .GetLabels());
             Log.Info("completedContainer" + " queue=" + GetQueueName() + " usedCapacity=" + GetUsedCapacity
                          () + " absoluteUsedCapacity=" + GetAbsoluteUsedCapacity() + " used=" + queueUsage
                      .GetUsed() + " cluster=" + clusterResource);
             // Note that this is using an iterator on the childQueues so this can't
             // be called if already within an iterator for the childQueues. Like
             // from assignContainersToChildQueues.
             if (sortQueues)
             {
                 // reinsert the updated queue
                 for (IEnumerator <CSQueue> iter = childQueues.GetEnumerator(); iter.HasNext();)
                 {
                     CSQueue csqueue = iter.Next();
                     if (csqueue.Equals(completedChildQueue))
                     {
                         iter.Remove();
                         Log.Info("Re-sorting completed queue: " + csqueue.GetQueuePath() + " stats: " + csqueue
                                  );
                         childQueues.AddItem(csqueue);
                         break;
                     }
                 }
             }
         }
         // Inform the parent
         if (parent != null)
         {
             // complete my parent
             parent.CompletedContainer(clusterResource, application, node, rmContainer, null,
                                       @event, this, sortQueues);
         }
     }
 }
Пример #10
0
 public override void DetachContainer(Org.Apache.Hadoop.Yarn.Api.Records.Resource
                                      clusterResource, FiCaSchedulerApp application, RMContainer rmContainer)
 {
     if (application != null)
     {
         FiCaSchedulerNode node = scheduler.GetNode(rmContainer.GetContainer().GetNodeId()
                                                    );
         base.ReleaseResource(clusterResource, rmContainer.GetContainer().GetResource(), node
                              .GetLabels());
         Log.Info("movedContainer" + " queueMoveOut=" + GetQueueName() + " usedCapacity="
                  + GetUsedCapacity() + " absoluteUsedCapacity=" + GetAbsoluteUsedCapacity() + " used="
                  + queueUsage.GetUsed() + " cluster=" + clusterResource);
         // Inform the parent
         if (parent != null)
         {
             parent.DetachContainer(clusterResource, application, rmContainer);
         }
     }
 }
Пример #11
0
 public override void SubmitApplicationAttempt(FiCaSchedulerApp application, string
                                               userName)
 {
 }
Пример #12
0
        public virtual void TestActiveLimitsWithKilledApps()
        {
            string user_0        = "user_0";
            int    ApplicationId = 0;
            // Submit first application
            FiCaSchedulerApp app_0 = GetMockApplication(ApplicationId++, user_0, Resources.CreateResource
                                                            (4 * Gb, 0));

            queue.SubmitApplicationAttempt(app_0, user_0);
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumActiveApplications());
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications());
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumActiveApplications(user_0));
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications(user_0));
            NUnit.Framework.Assert.IsTrue(queue.activeApplications.Contains(app_0));
            // Submit second application
            FiCaSchedulerApp app_1 = GetMockApplication(ApplicationId++, user_0, Resources.CreateResource
                                                            (4 * Gb, 0));

            queue.SubmitApplicationAttempt(app_1, user_0);
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumActiveApplications());
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications());
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumActiveApplications(user_0));
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications(user_0));
            NUnit.Framework.Assert.IsTrue(queue.activeApplications.Contains(app_1));
            // Submit third application, should remain pending
            FiCaSchedulerApp app_2 = GetMockApplication(ApplicationId++, user_0, Resources.CreateResource
                                                            (4 * Gb, 0));

            queue.SubmitApplicationAttempt(app_2, user_0);
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumActiveApplications());
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumPendingApplications());
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumActiveApplications(user_0));
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumPendingApplications(user_0));
            NUnit.Framework.Assert.IsTrue(queue.pendingApplications.Contains(app_2));
            // Submit fourth application, should remain pending
            FiCaSchedulerApp app_3 = GetMockApplication(ApplicationId++, user_0, Resources.CreateResource
                                                            (4 * Gb, 0));

            queue.SubmitApplicationAttempt(app_3, user_0);
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumActiveApplications());
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumPendingApplications());
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumActiveApplications(user_0));
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumPendingApplications(user_0));
            NUnit.Framework.Assert.IsTrue(queue.pendingApplications.Contains(app_3));
            // Kill 3rd pending application
            queue.FinishApplicationAttempt(app_2, A);
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumActiveApplications());
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumPendingApplications());
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumActiveApplications(user_0));
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumPendingApplications(user_0));
            NUnit.Framework.Assert.IsFalse(queue.pendingApplications.Contains(app_2));
            NUnit.Framework.Assert.IsFalse(queue.activeApplications.Contains(app_2));
            // Finish 1st application, app_3 should become active
            queue.FinishApplicationAttempt(app_0, A);
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumActiveApplications());
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications());
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumActiveApplications(user_0));
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications(user_0));
            NUnit.Framework.Assert.IsTrue(queue.activeApplications.Contains(app_3));
            NUnit.Framework.Assert.IsFalse(queue.pendingApplications.Contains(app_3));
            NUnit.Framework.Assert.IsFalse(queue.activeApplications.Contains(app_0));
            // Finish 2nd application
            queue.FinishApplicationAttempt(app_1, A);
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumActiveApplications());
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications());
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumActiveApplications(user_0));
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications(user_0));
            NUnit.Framework.Assert.IsFalse(queue.activeApplications.Contains(app_1));
            // Finish 4th application
            queue.FinishApplicationAttempt(app_3, A);
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumActiveApplications());
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications());
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumActiveApplications(user_0));
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications(user_0));
            NUnit.Framework.Assert.IsFalse(queue.activeApplications.Contains(app_3));
        }
Пример #13
0
        public virtual void TestHeadroom()
        {
            CapacitySchedulerConfiguration csConf = new CapacitySchedulerConfiguration();

            csConf.SetUserLimit(CapacitySchedulerConfiguration.Root + "." + A, 25);
            SetupQueueConfiguration(csConf);
            YarnConfiguration        conf      = new YarnConfiguration();
            CapacitySchedulerContext csContext = Org.Mockito.Mockito.Mock <CapacitySchedulerContext
                                                                           >();

            Org.Mockito.Mockito.When(csContext.GetConfiguration()).ThenReturn(csConf);
            Org.Mockito.Mockito.When(csContext.GetConf()).ThenReturn(conf);
            Org.Mockito.Mockito.When(csContext.GetMinimumResourceCapability()).ThenReturn(Resources
                                                                                          .CreateResource(Gb));
            Org.Mockito.Mockito.When(csContext.GetMaximumResourceCapability()).ThenReturn(Resources
                                                                                          .CreateResource(16 * Gb));
            Org.Mockito.Mockito.When(csContext.GetApplicationComparator()).ThenReturn(CapacityScheduler
                                                                                      .applicationComparator);
            Org.Mockito.Mockito.When(csContext.GetQueueComparator()).ThenReturn(CapacityScheduler
                                                                                .queueComparator);
            Org.Mockito.Mockito.When(csContext.GetResourceCalculator()).ThenReturn(resourceCalculator
                                                                                   );
            Org.Mockito.Mockito.When(csContext.GetRMContext()).ThenReturn(rmContext);
            // Say cluster has 100 nodes of 16G each
            Org.Apache.Hadoop.Yarn.Api.Records.Resource clusterResource = Resources.CreateResource
                                                                              (100 * 16 * Gb);
            Org.Mockito.Mockito.When(csContext.GetClusterResource()).ThenReturn(clusterResource
                                                                                );
            IDictionary <string, CSQueue> queues = new Dictionary <string, CSQueue>();

            CapacityScheduler.ParseQueue(csContext, csConf, null, "root", queues, queues, TestUtils
                                         .spyHook);
            // Manipulate queue 'a'
            LeafQueue         queue         = TestLeafQueue.StubLeafQueue((LeafQueue)queues[A]);
            string            host_0        = "host_0";
            string            rack_0        = "rack_0";
            FiCaSchedulerNode node_0        = TestUtils.GetMockNode(host_0, rack_0, 0, 16 * Gb);
            string            user_0        = "user_0";
            string            user_1        = "user_1";
            RecordFactory     recordFactory = RecordFactoryProvider.GetRecordFactory(null);
            RMContext         rmContext     = TestUtils.GetMockRMContext();
            RMContext         spyRMContext  = Org.Mockito.Mockito.Spy(rmContext);
            ConcurrentMap <ApplicationId, RMApp> spyApps = Org.Mockito.Mockito.Spy(new ConcurrentHashMap
                                                                                   <ApplicationId, RMApp>());
            RMApp           rmApp             = Org.Mockito.Mockito.Mock <RMApp>();
            ResourceRequest amResourceRequest = Org.Mockito.Mockito.Mock <ResourceRequest>();

            Org.Apache.Hadoop.Yarn.Api.Records.Resource amResource = Resources.CreateResource
                                                                         (0, 0);
            Org.Mockito.Mockito.When(amResourceRequest.GetCapability()).ThenReturn(amResource
                                                                                   );
            Org.Mockito.Mockito.When(rmApp.GetAMResourceRequest()).ThenReturn(amResourceRequest
                                                                              );
            Org.Mockito.Mockito.DoReturn(rmApp).When(spyApps)[(ApplicationId)Matchers.Any()];
            Org.Mockito.Mockito.When(spyRMContext.GetRMApps()).ThenReturn(spyApps);
            Priority priority_1 = TestUtils.CreateMockPriority(1);
            // Submit first application with some resource-requests from user_0,
            // and check headroom
            ApplicationAttemptId appAttemptId_0_0 = TestUtils.GetMockApplicationAttemptId(0,
                                                                                          0);
            FiCaSchedulerApp app_0_0 = new FiCaSchedulerApp(appAttemptId_0_0, user_0, queue,
                                                            queue.GetActiveUsersManager(), spyRMContext);

            queue.SubmitApplicationAttempt(app_0_0, user_0);
            IList <ResourceRequest> app_0_0_requests = new AList <ResourceRequest>();

            app_0_0_requests.AddItem(TestUtils.CreateResourceRequest(ResourceRequest.Any, 1 *
                                                                     Gb, 2, true, priority_1, recordFactory));
            app_0_0.UpdateResourceRequests(app_0_0_requests);
            // Schedule to compute
            queue.AssignContainers(clusterResource, node_0, new ResourceLimits(clusterResource
                                                                               ));
            Org.Apache.Hadoop.Yarn.Api.Records.Resource expectedHeadroom = Resources.CreateResource
                                                                               (10 * 16 * Gb, 1);
            NUnit.Framework.Assert.AreEqual(expectedHeadroom, app_0_0.GetHeadroom());
            // Submit second application from user_0, check headroom
            ApplicationAttemptId appAttemptId_0_1 = TestUtils.GetMockApplicationAttemptId(1,
                                                                                          0);
            FiCaSchedulerApp app_0_1 = new FiCaSchedulerApp(appAttemptId_0_1, user_0, queue,
                                                            queue.GetActiveUsersManager(), spyRMContext);

            queue.SubmitApplicationAttempt(app_0_1, user_0);
            IList <ResourceRequest> app_0_1_requests = new AList <ResourceRequest>();

            app_0_1_requests.AddItem(TestUtils.CreateResourceRequest(ResourceRequest.Any, 1 *
                                                                     Gb, 2, true, priority_1, recordFactory));
            app_0_1.UpdateResourceRequests(app_0_1_requests);
            // Schedule to compute
            queue.AssignContainers(clusterResource, node_0, new ResourceLimits(clusterResource
                                                                               ));
            // Schedule to compute
            NUnit.Framework.Assert.AreEqual(expectedHeadroom, app_0_0.GetHeadroom());
            NUnit.Framework.Assert.AreEqual(expectedHeadroom, app_0_1.GetHeadroom());
            // no change
            // Submit first application from user_1, check  for new headroom
            ApplicationAttemptId appAttemptId_1_0 = TestUtils.GetMockApplicationAttemptId(2,
                                                                                          0);
            FiCaSchedulerApp app_1_0 = new FiCaSchedulerApp(appAttemptId_1_0, user_1, queue,
                                                            queue.GetActiveUsersManager(), spyRMContext);

            queue.SubmitApplicationAttempt(app_1_0, user_1);
            IList <ResourceRequest> app_1_0_requests = new AList <ResourceRequest>();

            app_1_0_requests.AddItem(TestUtils.CreateResourceRequest(ResourceRequest.Any, 1 *
                                                                     Gb, 2, true, priority_1, recordFactory));
            app_1_0.UpdateResourceRequests(app_1_0_requests);
            // Schedule to compute
            queue.AssignContainers(clusterResource, node_0, new ResourceLimits(clusterResource
                                                                               ));
            // Schedule to compute
            expectedHeadroom = Resources.CreateResource(10 * 16 * Gb / 2, 1);
            // changes
            NUnit.Framework.Assert.AreEqual(expectedHeadroom, app_0_0.GetHeadroom());
            NUnit.Framework.Assert.AreEqual(expectedHeadroom, app_0_1.GetHeadroom());
            NUnit.Framework.Assert.AreEqual(expectedHeadroom, app_1_0.GetHeadroom());
            // Now reduce cluster size and check for the smaller headroom
            clusterResource = Resources.CreateResource(90 * 16 * Gb);
            queue.AssignContainers(clusterResource, node_0, new ResourceLimits(clusterResource
                                                                               ));
            // Schedule to compute
            expectedHeadroom = Resources.CreateResource(9 * 16 * Gb / 2, 1);
            // changes
            NUnit.Framework.Assert.AreEqual(expectedHeadroom, app_0_0.GetHeadroom());
            NUnit.Framework.Assert.AreEqual(expectedHeadroom, app_0_1.GetHeadroom());
            NUnit.Framework.Assert.AreEqual(expectedHeadroom, app_1_0.GetHeadroom());
        }
Пример #14
0
        public virtual void TestSortedQueues()
        {
            // Setup queue configs
            SetupSortedQueues(csConf);
            IDictionary <string, CSQueue> queues = new Dictionary <string, CSQueue>();
            CSQueue root = CapacityScheduler.ParseQueue(csContext, csConf, null, CapacitySchedulerConfiguration
                                                        .Root, queues, queues, TestUtils.spyHook);
            // Setup some nodes
            int memoryPerNode        = 10;
            int coresPerNode         = 16;
            int numNodes             = 1;
            FiCaSchedulerNode node_0 = TestUtils.GetMockNode("host_0", DefaultRack, 0, memoryPerNode
                                                             * Gb);

            Org.Mockito.Mockito.DoNothing().When(node_0).ReleaseContainer(Matchers.Any <Container
                                                                                        >());
            Org.Apache.Hadoop.Yarn.Api.Records.Resource clusterResource = Resources.CreateResource
                                                                              (numNodes * (memoryPerNode * Gb), numNodes * coresPerNode);
            Org.Mockito.Mockito.When(csContext.GetNumClusterNodes()).ThenReturn(numNodes);
            // Start testing
            CSQueue a      = queues[A];
            CSQueue b      = queues[B];
            CSQueue c      = queues[C];
            CSQueue d      = queues[D];
            string  user_0 = "user_0";
            // Stub an App and its containerCompleted
            FiCaSchedulerApp app_0 = GetMockApplication(0, user_0);

            Org.Mockito.Mockito.DoReturn(true).When(app_0).ContainerCompleted(Matchers.Any <RMContainer
                                                                                            >(), Matchers.Any <ContainerStatus>(), Matchers.Any <RMContainerEventType>());
            Priority priority = TestUtils.CreateMockPriority(1);
            ContainerAllocationExpirer expirer = Org.Mockito.Mockito.Mock <ContainerAllocationExpirer
                                                                           >();
            DrainDispatcher            drainDispatcher = new DrainDispatcher();
            RMApplicationHistoryWriter writer          = Org.Mockito.Mockito.Mock <RMApplicationHistoryWriter
                                                                                   >();
            SystemMetricsPublisher publisher = Org.Mockito.Mockito.Mock <SystemMetricsPublisher
                                                                         >();
            RMContext rmContext = Org.Mockito.Mockito.Mock <RMContext>();

            Org.Mockito.Mockito.When(rmContext.GetContainerAllocationExpirer()).ThenReturn(expirer
                                                                                           );
            Org.Mockito.Mockito.When(rmContext.GetDispatcher()).ThenReturn(drainDispatcher);
            Org.Mockito.Mockito.When(rmContext.GetRMApplicationHistoryWriter()).ThenReturn(writer
                                                                                           );
            Org.Mockito.Mockito.When(rmContext.GetSystemMetricsPublisher()).ThenReturn(publisher
                                                                                       );
            Org.Mockito.Mockito.When(rmContext.GetYarnConfiguration()).ThenReturn(new YarnConfiguration
                                                                                      ());
            ApplicationAttemptId appAttemptId = BuilderUtils.NewApplicationAttemptId(app_0.GetApplicationId
                                                                                         (), 1);
            ContainerId containerId = BuilderUtils.NewContainerId(appAttemptId, 1);
            Container   container   = TestUtils.GetMockContainer(containerId, node_0.GetNodeID(),
                                                                 Resources.CreateResource(1 * Gb), priority);
            RMContainer rmContainer = new RMContainerImpl(container, appAttemptId, node_0.GetNodeID
                                                              (), "user", rmContext);

            // Assign {1,2,3,4} 1GB containers respectively to queues
            StubQueueAllocation(a, clusterResource, node_0, 1 * Gb);
            StubQueueAllocation(b, clusterResource, node_0, 0 * Gb);
            StubQueueAllocation(c, clusterResource, node_0, 0 * Gb);
            StubQueueAllocation(d, clusterResource, node_0, 0 * Gb);
            root.AssignContainers(clusterResource, node_0, new ResourceLimits(clusterResource
                                                                              ));
            for (int i = 0; i < 2; i++)
            {
                StubQueueAllocation(a, clusterResource, node_0, 0 * Gb);
                StubQueueAllocation(b, clusterResource, node_0, 1 * Gb);
                StubQueueAllocation(c, clusterResource, node_0, 0 * Gb);
                StubQueueAllocation(d, clusterResource, node_0, 0 * Gb);
                root.AssignContainers(clusterResource, node_0, new ResourceLimits(clusterResource
                                                                                  ));
            }
            for (int i_1 = 0; i_1 < 3; i_1++)
            {
                StubQueueAllocation(a, clusterResource, node_0, 0 * Gb);
                StubQueueAllocation(b, clusterResource, node_0, 0 * Gb);
                StubQueueAllocation(c, clusterResource, node_0, 1 * Gb);
                StubQueueAllocation(d, clusterResource, node_0, 0 * Gb);
                root.AssignContainers(clusterResource, node_0, new ResourceLimits(clusterResource
                                                                                  ));
            }
            for (int i_2 = 0; i_2 < 4; i_2++)
            {
                StubQueueAllocation(a, clusterResource, node_0, 0 * Gb);
                StubQueueAllocation(b, clusterResource, node_0, 0 * Gb);
                StubQueueAllocation(c, clusterResource, node_0, 0 * Gb);
                StubQueueAllocation(d, clusterResource, node_0, 1 * Gb);
                root.AssignContainers(clusterResource, node_0, new ResourceLimits(clusterResource
                                                                                  ));
            }
            VerifyQueueMetrics(a, 1 * Gb, clusterResource);
            VerifyQueueMetrics(b, 2 * Gb, clusterResource);
            VerifyQueueMetrics(c, 3 * Gb, clusterResource);
            VerifyQueueMetrics(d, 4 * Gb, clusterResource);
            Log.Info("status child-queues: " + ((ParentQueue)root).GetChildQueuesToPrint());
            //Release 3 x 1GB containers from D
            for (int i_3 = 0; i_3 < 3; i_3++)
            {
                d.CompletedContainer(clusterResource, app_0, node_0, rmContainer, null, RMContainerEventType
                                     .Kill, null, true);
            }
            VerifyQueueMetrics(a, 1 * Gb, clusterResource);
            VerifyQueueMetrics(b, 2 * Gb, clusterResource);
            VerifyQueueMetrics(c, 3 * Gb, clusterResource);
            VerifyQueueMetrics(d, 1 * Gb, clusterResource);
            //reset manually resources on node
            node_0 = TestUtils.GetMockNode("host_0", DefaultRack, 0, (memoryPerNode - 1 - 2 -
                                                                      3 - 1) * Gb);
            Log.Info("status child-queues: " + ((ParentQueue)root).GetChildQueuesToPrint());
            // Assign 2 x 1GB Containers to A
            for (int i_4 = 0; i_4 < 2; i_4++)
            {
                StubQueueAllocation(a, clusterResource, node_0, 1 * Gb);
                StubQueueAllocation(b, clusterResource, node_0, 0 * Gb);
                StubQueueAllocation(c, clusterResource, node_0, 0 * Gb);
                StubQueueAllocation(d, clusterResource, node_0, 0 * Gb);
                root.AssignContainers(clusterResource, node_0, new ResourceLimits(clusterResource
                                                                                  ));
            }
            VerifyQueueMetrics(a, 3 * Gb, clusterResource);
            VerifyQueueMetrics(b, 2 * Gb, clusterResource);
            VerifyQueueMetrics(c, 3 * Gb, clusterResource);
            VerifyQueueMetrics(d, 1 * Gb, clusterResource);
            Log.Info("status child-queues: " + ((ParentQueue)root).GetChildQueuesToPrint());
            //Release 1GB Container from A
            a.CompletedContainer(clusterResource, app_0, node_0, rmContainer, null, RMContainerEventType
                                 .Kill, null, true);
            VerifyQueueMetrics(a, 2 * Gb, clusterResource);
            VerifyQueueMetrics(b, 2 * Gb, clusterResource);
            VerifyQueueMetrics(c, 3 * Gb, clusterResource);
            VerifyQueueMetrics(d, 1 * Gb, clusterResource);
            //reset manually resources on node
            node_0 = TestUtils.GetMockNode("host_0", DefaultRack, 0, (memoryPerNode - 2 - 2 -
                                                                      3 - 1) * Gb);
            Log.Info("status child-queues: " + ((ParentQueue)root).GetChildQueuesToPrint());
            // Assign 1GB container to B
            StubQueueAllocation(a, clusterResource, node_0, 0 * Gb);
            StubQueueAllocation(b, clusterResource, node_0, 1 * Gb);
            StubQueueAllocation(c, clusterResource, node_0, 0 * Gb);
            StubQueueAllocation(d, clusterResource, node_0, 0 * Gb);
            root.AssignContainers(clusterResource, node_0, new ResourceLimits(clusterResource
                                                                              ));
            VerifyQueueMetrics(a, 2 * Gb, clusterResource);
            VerifyQueueMetrics(b, 3 * Gb, clusterResource);
            VerifyQueueMetrics(c, 3 * Gb, clusterResource);
            VerifyQueueMetrics(d, 1 * Gb, clusterResource);
            Log.Info("status child-queues: " + ((ParentQueue)root).GetChildQueuesToPrint());
            //Release 1GB container resources from B
            b.CompletedContainer(clusterResource, app_0, node_0, rmContainer, null, RMContainerEventType
                                 .Kill, null, true);
            VerifyQueueMetrics(a, 2 * Gb, clusterResource);
            VerifyQueueMetrics(b, 2 * Gb, clusterResource);
            VerifyQueueMetrics(c, 3 * Gb, clusterResource);
            VerifyQueueMetrics(d, 1 * Gb, clusterResource);
            //reset manually resources on node
            node_0 = TestUtils.GetMockNode("host_0", DefaultRack, 0, (memoryPerNode - 2 - 2 -
                                                                      3 - 1) * Gb);
            Log.Info("status child-queues: " + ((ParentQueue)root).GetChildQueuesToPrint());
            // Assign 1GB container to A
            StubQueueAllocation(a, clusterResource, node_0, 1 * Gb);
            StubQueueAllocation(b, clusterResource, node_0, 0 * Gb);
            StubQueueAllocation(c, clusterResource, node_0, 0 * Gb);
            StubQueueAllocation(d, clusterResource, node_0, 0 * Gb);
            root.AssignContainers(clusterResource, node_0, new ResourceLimits(clusterResource
                                                                              ));
            VerifyQueueMetrics(a, 3 * Gb, clusterResource);
            VerifyQueueMetrics(b, 2 * Gb, clusterResource);
            VerifyQueueMetrics(c, 3 * Gb, clusterResource);
            VerifyQueueMetrics(d, 1 * Gb, clusterResource);
            Log.Info("status child-queues: " + ((ParentQueue)root).GetChildQueuesToPrint());
            // Now do the real test, where B and D request a 1GB container
            // D should should get the next container if the order is correct
            StubQueueAllocation(a, clusterResource, node_0, 0 * Gb);
            StubQueueAllocation(b, clusterResource, node_0, 1 * Gb);
            StubQueueAllocation(c, clusterResource, node_0, 0 * Gb);
            StubQueueAllocation(d, clusterResource, node_0, 1 * Gb);
            root.AssignContainers(clusterResource, node_0, new ResourceLimits(clusterResource
                                                                              ));
            InOrder allocationOrder = Org.Mockito.Mockito.InOrder(d, b);

            allocationOrder.Verify(d).AssignContainers(Matchers.Eq(clusterResource), Matchers.Any
                                                       <FiCaSchedulerNode>(), Matchers.Any <ResourceLimits>());
            allocationOrder.Verify(b).AssignContainers(Matchers.Eq(clusterResource), Matchers.Any
                                                       <FiCaSchedulerNode>(), Matchers.Any <ResourceLimits>());
            VerifyQueueMetrics(a, 3 * Gb, clusterResource);
            VerifyQueueMetrics(b, 2 * Gb, clusterResource);
            VerifyQueueMetrics(c, 3 * Gb, clusterResource);
            VerifyQueueMetrics(d, 2 * Gb, clusterResource);
            //D got the container
            Log.Info("status child-queues: " + ((ParentQueue)root).GetChildQueuesToPrint());
        }
Пример #15
0
 public abstract void CompletedContainer(Org.Apache.Hadoop.Yarn.Api.Records.Resource
                                         arg1, FiCaSchedulerApp arg2, FiCaSchedulerNode arg3, RMContainer arg4, ContainerStatus
                                         arg5, RMContainerEventType arg6, CSQueue arg7, bool arg8);
Пример #16
0
        public virtual void TestActiveApplicationLimits()
        {
            string user_0 = "user_0";
            string user_1 = "user_1";
            string user_2 = "user_2";

            NUnit.Framework.Assert.AreEqual(Org.Apache.Hadoop.Yarn.Api.Records.Resource.NewInstance
                                                (16 * Gb, 1), queue.GetAMResourceLimit());
            NUnit.Framework.Assert.AreEqual(Org.Apache.Hadoop.Yarn.Api.Records.Resource.NewInstance
                                                (8 * Gb, 1), queue.GetUserAMResourceLimit());
            int ApplicationId = 0;
            // Submit first application
            FiCaSchedulerApp app_0 = GetMockApplication(ApplicationId++, user_0, Resources.CreateResource
                                                            (4 * Gb, 0));

            queue.SubmitApplicationAttempt(app_0, user_0);
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumActiveApplications());
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications());
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumActiveApplications(user_0));
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications(user_0));
            // Submit second application
            FiCaSchedulerApp app_1 = GetMockApplication(ApplicationId++, user_0, Resources.CreateResource
                                                            (4 * Gb, 0));

            queue.SubmitApplicationAttempt(app_1, user_0);
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumActiveApplications());
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications());
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumActiveApplications(user_0));
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications(user_0));
            // Submit third application, should remain pending due to user amlimit
            FiCaSchedulerApp app_2 = GetMockApplication(ApplicationId++, user_0, Resources.CreateResource
                                                            (4 * Gb, 0));

            queue.SubmitApplicationAttempt(app_2, user_0);
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumActiveApplications());
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumPendingApplications());
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumActiveApplications(user_0));
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumPendingApplications(user_0));
            // Finish one application, app_2 should be activated
            queue.FinishApplicationAttempt(app_0, A);
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumActiveApplications());
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications());
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumActiveApplications(user_0));
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications(user_0));
            // Submit another one for user_0
            FiCaSchedulerApp app_3 = GetMockApplication(ApplicationId++, user_0, Resources.CreateResource
                                                            (4 * Gb, 0));

            queue.SubmitApplicationAttempt(app_3, user_0);
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumActiveApplications());
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumPendingApplications());
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumActiveApplications(user_0));
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumPendingApplications(user_0));
            // Submit first app for user_1
            FiCaSchedulerApp app_4 = GetMockApplication(ApplicationId++, user_1, Resources.CreateResource
                                                            (8 * Gb, 0));

            queue.SubmitApplicationAttempt(app_4, user_1);
            NUnit.Framework.Assert.AreEqual(3, queue.GetNumActiveApplications());
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumPendingApplications());
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumActiveApplications(user_0));
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumPendingApplications(user_0));
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumActiveApplications(user_1));
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications(user_1));
            // Submit first app for user_2, should block due to queue amlimit
            FiCaSchedulerApp app_5 = GetMockApplication(ApplicationId++, user_2, Resources.CreateResource
                                                            (8 * Gb, 0));

            queue.SubmitApplicationAttempt(app_5, user_2);
            NUnit.Framework.Assert.AreEqual(3, queue.GetNumActiveApplications());
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumPendingApplications());
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumActiveApplications(user_0));
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumPendingApplications(user_0));
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumActiveApplications(user_1));
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications(user_1));
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumPendingApplications(user_2));
            // Now finish one app of user_1 so app_5 should be activated
            queue.FinishApplicationAttempt(app_4, A);
            NUnit.Framework.Assert.AreEqual(3, queue.GetNumActiveApplications());
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumPendingApplications());
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumActiveApplications(user_0));
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumPendingApplications(user_0));
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumActiveApplications(user_1));
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications(user_1));
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumActiveApplications(user_2));
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications(user_2));
        }
Пример #17
0
 public abstract void SubmitApplicationAttempt(FiCaSchedulerApp arg1, string arg2);
Пример #18
0
 public abstract void FinishApplicationAttempt(FiCaSchedulerApp arg1, string arg2);
Пример #19
0
 public abstract void DetachContainer(Org.Apache.Hadoop.Yarn.Api.Records.Resource
                                      arg1, FiCaSchedulerApp arg2, RMContainer arg3);
Пример #20
0
 // submit attempt logic.
 public override void FinishApplicationAttempt(FiCaSchedulerApp application, string
                                               queue)
 {
 }
Пример #21
0
        public virtual void TestAMResourceLimit()
        {
            string user_0 = "user_0";
            string user_1 = "user_1";

            // This uses the default 10% of cluster value for the max am resources
            // which are allowed, at 80GB = 8GB for AM's at the queue level.  The user
            // am limit is 4G initially (based on the queue absolute capacity)
            // when there is only 1 user, and drops to 2G (the userlimit) when there
            // is a second user
            Org.Apache.Hadoop.Yarn.Api.Records.Resource clusterResource = Org.Apache.Hadoop.Yarn.Api.Records.Resource
                                                                          .NewInstance(80 * Gb, 40);
            queue.UpdateClusterResource(clusterResource, new ResourceLimits(clusterResource));
            ActiveUsersManager activeUsersManager = Org.Mockito.Mockito.Mock <ActiveUsersManager
                                                                              >();

            Org.Mockito.Mockito.When(queue.GetActiveUsersManager()).ThenReturn(activeUsersManager
                                                                               );
            NUnit.Framework.Assert.AreEqual(Org.Apache.Hadoop.Yarn.Api.Records.Resource.NewInstance
                                                (8 * Gb, 1), queue.GetAMResourceLimit());
            NUnit.Framework.Assert.AreEqual(Org.Apache.Hadoop.Yarn.Api.Records.Resource.NewInstance
                                                (4 * Gb, 1), queue.GetUserAMResourceLimit());
            // Two apps for user_0, both start
            int ApplicationId      = 0;
            FiCaSchedulerApp app_0 = GetMockApplication(ApplicationId++, user_0, Org.Apache.Hadoop.Yarn.Api.Records.Resource
                                                        .NewInstance(2 * Gb, 1));

            queue.SubmitApplicationAttempt(app_0, user_0);
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumActiveApplications());
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications());
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumActiveApplications(user_0));
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications(user_0));
            Org.Mockito.Mockito.When(activeUsersManager.GetNumActiveUsers()).ThenReturn(1);
            FiCaSchedulerApp app_1 = GetMockApplication(ApplicationId++, user_0, Org.Apache.Hadoop.Yarn.Api.Records.Resource
                                                        .NewInstance(2 * Gb, 1));

            queue.SubmitApplicationAttempt(app_1, user_0);
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumActiveApplications());
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications());
            NUnit.Framework.Assert.AreEqual(2, queue.GetNumActiveApplications(user_0));
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications(user_0));
            // AMLimits unchanged
            NUnit.Framework.Assert.AreEqual(Org.Apache.Hadoop.Yarn.Api.Records.Resource.NewInstance
                                                (8 * Gb, 1), queue.GetAMResourceLimit());
            NUnit.Framework.Assert.AreEqual(Org.Apache.Hadoop.Yarn.Api.Records.Resource.NewInstance
                                                (4 * Gb, 1), queue.GetUserAMResourceLimit());
            // One app for user_1, starts
            FiCaSchedulerApp app_2 = GetMockApplication(ApplicationId++, user_1, Org.Apache.Hadoop.Yarn.Api.Records.Resource
                                                        .NewInstance(2 * Gb, 1));

            queue.SubmitApplicationAttempt(app_2, user_1);
            NUnit.Framework.Assert.AreEqual(3, queue.GetNumActiveApplications());
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications());
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumActiveApplications(user_1));
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications(user_1));
            Org.Mockito.Mockito.When(activeUsersManager.GetNumActiveUsers()).ThenReturn(2);
            // Now userAMResourceLimit drops to the queue configured 50% as there is
            // another user active
            NUnit.Framework.Assert.AreEqual(Org.Apache.Hadoop.Yarn.Api.Records.Resource.NewInstance
                                                (8 * Gb, 1), queue.GetAMResourceLimit());
            NUnit.Framework.Assert.AreEqual(Org.Apache.Hadoop.Yarn.Api.Records.Resource.NewInstance
                                                (2 * Gb, 1), queue.GetUserAMResourceLimit());
            // Second user_1 app cannot start
            FiCaSchedulerApp app_3 = GetMockApplication(ApplicationId++, user_1, Org.Apache.Hadoop.Yarn.Api.Records.Resource
                                                        .NewInstance(2 * Gb, 1));

            queue.SubmitApplicationAttempt(app_3, user_1);
            NUnit.Framework.Assert.AreEqual(3, queue.GetNumActiveApplications());
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumPendingApplications());
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumActiveApplications(user_1));
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumPendingApplications(user_1));
            // Now finish app so another should be activated
            queue.FinishApplicationAttempt(app_2, A);
            NUnit.Framework.Assert.AreEqual(3, queue.GetNumActiveApplications());
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications());
            NUnit.Framework.Assert.AreEqual(1, queue.GetNumActiveApplications(user_1));
            NUnit.Framework.Assert.AreEqual(0, queue.GetNumPendingApplications(user_1));
        }