예제 #1
0
        /// <summary>
        /// Utility method to validate a resource request, by insuring that the
        /// requested memory/vcore is non-negative and not greater than max
        /// </summary>
        /// <exception cref="Org.Apache.Hadoop.Yarn.Exceptions.InvalidResourceRequestException
        ///     ">when there is invalid request</exception>
        private static void ValidateResourceRequest(ResourceRequest resReq, Org.Apache.Hadoop.Yarn.Api.Records.Resource
                                                    maximumResource, QueueInfo queueInfo, RMContext rmContext)
        {
            if (resReq.GetCapability().GetMemory() < 0 || resReq.GetCapability().GetMemory()
                > maximumResource.GetMemory())
            {
                throw new InvalidResourceRequestException("Invalid resource request" + ", requested memory < 0"
                                                          + ", or requested memory > max configured" + ", requestedMemory=" + resReq.GetCapability
                                                              ().GetMemory() + ", maxMemory=" + maximumResource.GetMemory());
            }
            if (resReq.GetCapability().GetVirtualCores() < 0 || resReq.GetCapability().GetVirtualCores
                    () > maximumResource.GetVirtualCores())
            {
                throw new InvalidResourceRequestException("Invalid resource request" + ", requested virtual cores < 0"
                                                          + ", or requested virtual cores > max configured" + ", requestedVirtualCores="
                                                          + resReq.GetCapability().GetVirtualCores() + ", maxVirtualCores=" + maximumResource
                                                          .GetVirtualCores());
            }
            string labelExp = resReq.GetNodeLabelExpression();

            // we don't allow specify label expression other than resourceName=ANY now
            if (!ResourceRequest.Any.Equals(resReq.GetResourceName()) && labelExp != null &&
                !labelExp.Trim().IsEmpty())
            {
                throw new InvalidResourceRequestException("Invailid resource request, queue=" + queueInfo
                                                          .GetQueueName() + " specified node label expression in a " + "resource request has resource name = "
                                                          + resReq.GetResourceName());
            }
            // we don't allow specify label expression with more than one node labels now
            if (labelExp != null && labelExp.Contains("&&"))
            {
                throw new InvalidResourceRequestException("Invailid resource request, queue=" + queueInfo
                                                          .GetQueueName() + " specified more than one node label " + "in a node label expression, node label expression = "
                                                          + labelExp);
            }
            if (labelExp != null && !labelExp.Trim().IsEmpty() && queueInfo != null)
            {
                if (!CheckQueueLabelExpression(queueInfo.GetAccessibleNodeLabels(), labelExp, rmContext
                                               ))
                {
                    throw new InvalidResourceRequestException("Invalid resource request" + ", queue="
                                                              + queueInfo.GetQueueName() + " doesn't have permission to access all labels " +
                                                              "in resource request. labelExpression of resource request=" + labelExp + ". Queue labels="
                                                              + (queueInfo.GetAccessibleNodeLabels() == null ? string.Empty : StringUtils.Join
                                                                     (queueInfo.GetAccessibleNodeLabels().GetEnumerator(), ',')));
                }
            }
        }
예제 #2
0
        /// <exception cref="System.IO.IOException"/>
        public virtual void TestNormalizeNodeLabelExpression()
        {
            // mock queue and scheduler
            YarnScheduler        scheduler = Org.Mockito.Mockito.Mock <YarnScheduler>();
            ICollection <string> queueAccessibleNodeLabels = Sets.NewHashSet();
            QueueInfo            queueInfo = Org.Mockito.Mockito.Mock <QueueInfo>();

            Org.Mockito.Mockito.When(queueInfo.GetQueueName()).ThenReturn("queue");
            Org.Mockito.Mockito.When(queueInfo.GetAccessibleNodeLabels()).ThenReturn(queueAccessibleNodeLabels
                                                                                     );
            Org.Mockito.Mockito.When(queueInfo.GetDefaultNodeLabelExpression()).ThenReturn(" x "
                                                                                           );
            Org.Mockito.Mockito.When(scheduler.GetQueueInfo(Matchers.Any <string>(), Matchers.AnyBoolean
                                                                (), Matchers.AnyBoolean())).ThenReturn(queueInfo);
            Org.Apache.Hadoop.Yarn.Api.Records.Resource maxResource = Resources.CreateResource
                                                                          (YarnConfiguration.DefaultRmSchedulerMaximumAllocationMb, YarnConfiguration.DefaultRmSchedulerMaximumAllocationVcores
                                                                          );
            // queue has labels, success cases
            try
            {
                // set queue accessible node labels to [x, y]
                queueAccessibleNodeLabels.Clear();
                Sharpen.Collections.AddAll(queueAccessibleNodeLabels, Arrays.AsList("x", "y"));
                rmContext.GetNodeLabelManager().AddToCluserNodeLabels(ImmutableSet.Of("x", "y"));
                Org.Apache.Hadoop.Yarn.Api.Records.Resource resource = Resources.CreateResource(0
                                                                                                , YarnConfiguration.DefaultRmSchedulerMinimumAllocationVcores);
                ResourceRequest resReq = BuilderUtils.NewResourceRequest(Org.Mockito.Mockito.Mock
                                                                         <Priority>(), ResourceRequest.Any, resource, 1);
                SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler
                                                           , rmContext);
                NUnit.Framework.Assert.IsTrue(resReq.GetNodeLabelExpression().Equals("x"));
                resReq.SetNodeLabelExpression(" y ");
                SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler
                                                           , rmContext);
                NUnit.Framework.Assert.IsTrue(resReq.GetNodeLabelExpression().Equals("y"));
            }
            catch (InvalidResourceRequestException e)
            {
                Sharpen.Runtime.PrintStackTrace(e);
                NUnit.Framework.Assert.Fail("Should be valid when request labels is a subset of queue labels"
                                            );
            }
            finally
            {
                rmContext.GetNodeLabelManager().RemoveFromClusterNodeLabels(Arrays.AsList("x", "y"
                                                                                          ));
            }
        }
예제 #3
0
        private void PrintQueueInfo(PrintWriter writer, QueueInfo queueInfo)
        {
            writer.Write("Queue Name : ");
            writer.WriteLine(queueInfo.GetQueueName());
            writer.Write("\tState : ");
            writer.WriteLine(queueInfo.GetQueueState());
            DecimalFormat df = new DecimalFormat("#.0");

            writer.Write("\tCapacity : ");
            writer.WriteLine(df.Format(queueInfo.GetCapacity() * 100) + "%");
            writer.Write("\tCurrent Capacity : ");
            writer.WriteLine(df.Format(queueInfo.GetCurrentCapacity() * 100) + "%");
            writer.Write("\tMaximum Capacity : ");
            writer.WriteLine(df.Format(queueInfo.GetMaximumCapacity() * 100) + "%");
            writer.Write("\tDefault Node Label expression : ");
            if (null != queueInfo.GetDefaultNodeLabelExpression())
            {
                writer.WriteLine(queueInfo.GetDefaultNodeLabelExpression());
            }
            else
            {
                writer.WriteLine();
            }
            ICollection <string> nodeLabels = queueInfo.GetAccessibleNodeLabels();
            StringBuilder        labelList  = new StringBuilder();

            writer.Write("\tAccessible Node Labels : ");
            foreach (string nodeLabel in nodeLabels)
            {
                if (labelList.Length > 0)
                {
                    labelList.Append(',');
                }
                labelList.Append(nodeLabel);
            }
            writer.WriteLine(labelList.ToString());
        }
예제 #4
0
        /// <exception cref="System.IO.IOException"/>
        public virtual void TestValidateResourceRequestWithErrorLabelsPermission()
        {
            // mock queue and scheduler
            YarnScheduler        scheduler = Org.Mockito.Mockito.Mock <YarnScheduler>();
            ICollection <string> queueAccessibleNodeLabels = Sets.NewHashSet();
            QueueInfo            queueInfo = Org.Mockito.Mockito.Mock <QueueInfo>();

            Org.Mockito.Mockito.When(queueInfo.GetQueueName()).ThenReturn("queue");
            Org.Mockito.Mockito.When(queueInfo.GetAccessibleNodeLabels()).ThenReturn(queueAccessibleNodeLabels
                                                                                     );
            Org.Mockito.Mockito.When(scheduler.GetQueueInfo(Matchers.Any <string>(), Matchers.AnyBoolean
                                                                (), Matchers.AnyBoolean())).ThenReturn(queueInfo);
            Org.Apache.Hadoop.Yarn.Api.Records.Resource maxResource = Resources.CreateResource
                                                                          (YarnConfiguration.DefaultRmSchedulerMaximumAllocationMb, YarnConfiguration.DefaultRmSchedulerMaximumAllocationVcores
                                                                          );
            // queue has labels, success cases
            try
            {
                // set queue accessible node labesl to [x, y]
                queueAccessibleNodeLabels.Clear();
                Sharpen.Collections.AddAll(queueAccessibleNodeLabels, Arrays.AsList("x", "y"));
                rmContext.GetNodeLabelManager().AddToCluserNodeLabels(ImmutableSet.Of("x", "y"));
                Org.Apache.Hadoop.Yarn.Api.Records.Resource resource = Resources.CreateResource(0
                                                                                                , YarnConfiguration.DefaultRmSchedulerMinimumAllocationVcores);
                ResourceRequest resReq = BuilderUtils.NewResourceRequest(Org.Mockito.Mockito.Mock
                                                                         <Priority>(), ResourceRequest.Any, resource, 1);
                resReq.SetNodeLabelExpression("x");
                SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler
                                                           , rmContext);
                resReq.SetNodeLabelExpression("y");
                SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler
                                                           , rmContext);
                resReq.SetNodeLabelExpression(string.Empty);
                SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler
                                                           , rmContext);
                resReq.SetNodeLabelExpression(" ");
                SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler
                                                           , rmContext);
            }
            catch (InvalidResourceRequestException e)
            {
                Sharpen.Runtime.PrintStackTrace(e);
                NUnit.Framework.Assert.Fail("Should be valid when request labels is a subset of queue labels"
                                            );
            }
            finally
            {
                rmContext.GetNodeLabelManager().RemoveFromClusterNodeLabels(Arrays.AsList("x", "y"
                                                                                          ));
            }
            // same as above, but cluster node labels don't contains label being
            // requested. should fail
            try
            {
                // set queue accessible node labesl to [x, y]
                queueAccessibleNodeLabels.Clear();
                Sharpen.Collections.AddAll(queueAccessibleNodeLabels, Arrays.AsList("x", "y"));
                Org.Apache.Hadoop.Yarn.Api.Records.Resource resource = Resources.CreateResource(0
                                                                                                , YarnConfiguration.DefaultRmSchedulerMinimumAllocationVcores);
                ResourceRequest resReq = BuilderUtils.NewResourceRequest(Org.Mockito.Mockito.Mock
                                                                         <Priority>(), ResourceRequest.Any, resource, 1);
                resReq.SetNodeLabelExpression("x");
                SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler
                                                           , rmContext);
                NUnit.Framework.Assert.Fail("Should fail");
            }
            catch (InvalidResourceRequestException)
            {
            }
            // queue has labels, failed cases (when ask a label not included by queue)
            try
            {
                // set queue accessible node labesl to [x, y]
                queueAccessibleNodeLabels.Clear();
                Sharpen.Collections.AddAll(queueAccessibleNodeLabels, Arrays.AsList("x", "y"));
                rmContext.GetNodeLabelManager().AddToCluserNodeLabels(ImmutableSet.Of("x", "y"));
                Org.Apache.Hadoop.Yarn.Api.Records.Resource resource = Resources.CreateResource(0
                                                                                                , YarnConfiguration.DefaultRmSchedulerMinimumAllocationVcores);
                ResourceRequest resReq = BuilderUtils.NewResourceRequest(Org.Mockito.Mockito.Mock
                                                                         <Priority>(), ResourceRequest.Any, resource, 1);
                resReq.SetNodeLabelExpression("z");
                SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler
                                                           , rmContext);
                NUnit.Framework.Assert.Fail("Should fail");
            }
            catch (InvalidResourceRequestException)
            {
            }
            finally
            {
                rmContext.GetNodeLabelManager().RemoveFromClusterNodeLabels(Arrays.AsList("x", "y"
                                                                                          ));
            }
            // we don't allow specify more than two node labels in a single expression
            // now
            try
            {
                // set queue accessible node labesl to [x, y]
                queueAccessibleNodeLabels.Clear();
                Sharpen.Collections.AddAll(queueAccessibleNodeLabels, Arrays.AsList("x", "y"));
                rmContext.GetNodeLabelManager().AddToCluserNodeLabels(ImmutableSet.Of("x", "y"));
                Org.Apache.Hadoop.Yarn.Api.Records.Resource resource = Resources.CreateResource(0
                                                                                                , YarnConfiguration.DefaultRmSchedulerMinimumAllocationVcores);
                ResourceRequest resReq = BuilderUtils.NewResourceRequest(Org.Mockito.Mockito.Mock
                                                                         <Priority>(), ResourceRequest.Any, resource, 1);
                resReq.SetNodeLabelExpression("x && y");
                SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler
                                                           , rmContext);
                NUnit.Framework.Assert.Fail("Should fail");
            }
            catch (InvalidResourceRequestException)
            {
            }
            finally
            {
                rmContext.GetNodeLabelManager().RemoveFromClusterNodeLabels(Arrays.AsList("x", "y"
                                                                                          ));
            }
            // queue doesn't have label, succeed (when request no label)
            queueAccessibleNodeLabels.Clear();
            try
            {
                // set queue accessible node labels to empty
                queueAccessibleNodeLabels.Clear();
                Org.Apache.Hadoop.Yarn.Api.Records.Resource resource = Resources.CreateResource(0
                                                                                                , YarnConfiguration.DefaultRmSchedulerMinimumAllocationVcores);
                ResourceRequest resReq = BuilderUtils.NewResourceRequest(Org.Mockito.Mockito.Mock
                                                                         <Priority>(), ResourceRequest.Any, resource, 1);
                SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler
                                                           , rmContext);
                resReq.SetNodeLabelExpression(string.Empty);
                SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler
                                                           , rmContext);
                resReq.SetNodeLabelExpression("  ");
                SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler
                                                           , rmContext);
            }
            catch (InvalidResourceRequestException e)
            {
                Sharpen.Runtime.PrintStackTrace(e);
                NUnit.Framework.Assert.Fail("Should be valid when request labels is empty");
            }
            // queue doesn't have label, failed (when request any label)
            try
            {
                // set queue accessible node labels to empty
                queueAccessibleNodeLabels.Clear();
                rmContext.GetNodeLabelManager().AddToCluserNodeLabels(ImmutableSet.Of("x"));
                Org.Apache.Hadoop.Yarn.Api.Records.Resource resource = Resources.CreateResource(0
                                                                                                , YarnConfiguration.DefaultRmSchedulerMinimumAllocationVcores);
                ResourceRequest resReq = BuilderUtils.NewResourceRequest(Org.Mockito.Mockito.Mock
                                                                         <Priority>(), ResourceRequest.Any, resource, 1);
                resReq.SetNodeLabelExpression("x");
                SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler
                                                           , rmContext);
                NUnit.Framework.Assert.Fail("Should fail");
            }
            catch (InvalidResourceRequestException)
            {
            }
            finally
            {
                rmContext.GetNodeLabelManager().RemoveFromClusterNodeLabels(Arrays.AsList("x"));
            }
            // queue is "*", always succeeded
            try
            {
                // set queue accessible node labels to empty
                queueAccessibleNodeLabels.Clear();
                queueAccessibleNodeLabels.AddItem(RMNodeLabelsManager.Any);
                rmContext.GetNodeLabelManager().AddToCluserNodeLabels(ImmutableSet.Of("x", "y", "z"
                                                                                      ));
                Org.Apache.Hadoop.Yarn.Api.Records.Resource resource = Resources.CreateResource(0
                                                                                                , YarnConfiguration.DefaultRmSchedulerMinimumAllocationVcores);
                ResourceRequest resReq = BuilderUtils.NewResourceRequest(Org.Mockito.Mockito.Mock
                                                                         <Priority>(), ResourceRequest.Any, resource, 1);
                resReq.SetNodeLabelExpression("x");
                SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler
                                                           , rmContext);
                resReq.SetNodeLabelExpression("y");
                SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler
                                                           , rmContext);
                resReq.SetNodeLabelExpression("z");
                SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler
                                                           , rmContext);
            }
            catch (InvalidResourceRequestException e)
            {
                Sharpen.Runtime.PrintStackTrace(e);
                NUnit.Framework.Assert.Fail("Should be valid when queue can access any labels");
            }
            finally
            {
                rmContext.GetNodeLabelManager().RemoveFromClusterNodeLabels(Arrays.AsList("x", "y"
                                                                                          , "z"));
            }
            // same as above, but cluster node labels don't contains label, should fail
            try
            {
                // set queue accessible node labels to empty
                queueAccessibleNodeLabels.Clear();
                queueAccessibleNodeLabels.AddItem(RMNodeLabelsManager.Any);
                Org.Apache.Hadoop.Yarn.Api.Records.Resource resource = Resources.CreateResource(0
                                                                                                , YarnConfiguration.DefaultRmSchedulerMinimumAllocationVcores);
                ResourceRequest resReq = BuilderUtils.NewResourceRequest(Org.Mockito.Mockito.Mock
                                                                         <Priority>(), ResourceRequest.Any, resource, 1);
                resReq.SetNodeLabelExpression("x");
                SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler
                                                           , rmContext);
                NUnit.Framework.Assert.Fail("Should fail");
            }
            catch (InvalidResourceRequestException)
            {
            }
            // we don't allow resource name other than ANY and specify label
            try
            {
                // set queue accessible node labesl to [x, y]
                queueAccessibleNodeLabels.Clear();
                Sharpen.Collections.AddAll(queueAccessibleNodeLabels, Arrays.AsList("x", "y"));
                rmContext.GetNodeLabelManager().AddToCluserNodeLabels(ImmutableSet.Of("x", "y"));
                Org.Apache.Hadoop.Yarn.Api.Records.Resource resource = Resources.CreateResource(0
                                                                                                , YarnConfiguration.DefaultRmSchedulerMinimumAllocationVcores);
                ResourceRequest resReq = BuilderUtils.NewResourceRequest(Org.Mockito.Mockito.Mock
                                                                         <Priority>(), "rack", resource, 1);
                resReq.SetNodeLabelExpression("x");
                SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler
                                                           , rmContext);
                NUnit.Framework.Assert.Fail("Should fail");
            }
            catch (InvalidResourceRequestException)
            {
            }
            finally
            {
                rmContext.GetNodeLabelManager().RemoveFromClusterNodeLabels(Arrays.AsList("x", "y"
                                                                                          ));
            }
            // we don't allow resource name other than ANY and specify label even if
            // queue has accessible label = *
            try
            {
                // set queue accessible node labesl to *
                queueAccessibleNodeLabels.Clear();
                Sharpen.Collections.AddAll(queueAccessibleNodeLabels, Arrays.AsList(CommonNodeLabelsManager
                                                                                    .Any));
                rmContext.GetNodeLabelManager().AddToCluserNodeLabels(ImmutableSet.Of("x"));
                Org.Apache.Hadoop.Yarn.Api.Records.Resource resource = Resources.CreateResource(0
                                                                                                , YarnConfiguration.DefaultRmSchedulerMinimumAllocationVcores);
                ResourceRequest resReq = BuilderUtils.NewResourceRequest(Org.Mockito.Mockito.Mock
                                                                         <Priority>(), "rack", resource, 1);
                resReq.SetNodeLabelExpression("x");
                SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler
                                                           , rmContext);
                NUnit.Framework.Assert.Fail("Should fail");
            }
            catch (InvalidResourceRequestException)
            {
            }
            finally
            {
                rmContext.GetNodeLabelManager().RemoveFromClusterNodeLabels(Arrays.AsList("x"));
            }
        }