public virtual int Compare(Schedulable s1, Schedulable s2)
            {
                ResourceWeights sharesOfCluster1  = new ResourceWeights();
                ResourceWeights sharesOfCluster2  = new ResourceWeights();
                ResourceWeights sharesOfMinShare1 = new ResourceWeights();
                ResourceWeights sharesOfMinShare2 = new ResourceWeights();

                ResourceType[] resourceOrder1 = new ResourceType[NumResources];
                ResourceType[] resourceOrder2 = new ResourceType[NumResources];
                // Calculate shares of the cluster for each resource both schedulables.
                CalculateShares(s1.GetResourceUsage(), clusterCapacity, sharesOfCluster1, resourceOrder1
                                , s1.GetWeights());
                CalculateShares(s1.GetResourceUsage(), s1.GetMinShare(), sharesOfMinShare1, null,
                                ResourceWeights.Neutral);
                CalculateShares(s2.GetResourceUsage(), clusterCapacity, sharesOfCluster2, resourceOrder2
                                , s2.GetWeights());
                CalculateShares(s2.GetResourceUsage(), s2.GetMinShare(), sharesOfMinShare2, null,
                                ResourceWeights.Neutral);
                // A queue is needy for its min share if its dominant resource
                // (with respect to the cluster capacity) is below its configured min share
                // for that resource
                bool s1Needy = sharesOfMinShare1.GetWeight(resourceOrder1[0]) < 1.0f;
                bool s2Needy = sharesOfMinShare2.GetWeight(resourceOrder2[0]) < 1.0f;
                int  res     = 0;

                if (!s2Needy && !s1Needy)
                {
                    res = CompareShares(sharesOfCluster1, sharesOfCluster2, resourceOrder1, resourceOrder2
                                        );
                }
                else
                {
                    if (s1Needy && !s2Needy)
                    {
                        res = -1;
                    }
                    else
                    {
                        if (s2Needy && !s1Needy)
                        {
                            res = 1;
                        }
                        else
                        {
                            // both are needy below min share
                            res = CompareShares(sharesOfMinShare1, sharesOfMinShare2, resourceOrder1, resourceOrder2
                                                );
                        }
                    }
                }
                if (res == 0)
                {
                    // Apps are tied in fairness ratio. Break the tie by submit time.
                    res = (int)(s1.GetStartTime() - s2.GetStartTime());
                }
                return(res);
            }
Пример #2
0
 public FSAppAttempt(FairScheduler scheduler, ApplicationAttemptId applicationAttemptId
                     , string user, FSLeafQueue queue, ActiveUsersManager activeUsersManager, RMContext
                     rmContext)
     : base(applicationAttemptId, user, queue, activeUsersManager, rmContext)
 {
     this.scheduler       = scheduler;
     this.startTime       = scheduler.GetClock().GetTime();
     this.priority        = Priority.NewInstance(1);
     this.resourceWeights = new ResourceWeights();
 }
 private Schedulable CreateSchedulable(int memUsage, int cpuUsage, ResourceWeights
                                       weights, int minMemShare, int minCpuShare)
 {
     Org.Apache.Hadoop.Yarn.Api.Records.Resource usage = BuilderUtils.NewResource(memUsage
                                                                                  , cpuUsage);
     Org.Apache.Hadoop.Yarn.Api.Records.Resource minShare = BuilderUtils.NewResource(minMemShare
                                                                                     , minCpuShare);
     return(new FakeSchedulable(minShare, Resources.CreateResource(int.MaxValue, int.MaxValue
                                                                   ), weights, Resources.None(), usage, 0l));
 }
Пример #4
0
 public FakeSchedulable(Org.Apache.Hadoop.Yarn.Api.Records.Resource minShare, Org.Apache.Hadoop.Yarn.Api.Records.Resource
                        maxShare, ResourceWeights weight, Org.Apache.Hadoop.Yarn.Api.Records.Resource fairShare
                        , Org.Apache.Hadoop.Yarn.Api.Records.Resource usage, long startTime)
 {
     this.minShare = minShare;
     this.maxShare = maxShare;
     this.weights  = weight;
     SetFairShare(fairShare);
     this.usage     = usage;
     this.priority  = Org.Apache.Hadoop.Yarn.Util.Records.NewRecord <Priority>();
     this.startTime = startTime;
 }
 private int CompareShares(ResourceWeights shares1, ResourceWeights shares2, ResourceType
                           [] resourceOrder1, ResourceType[] resourceOrder2)
 {
     for (int i = 0; i < resourceOrder1.Length; i++)
     {
         int ret = (int)Math.Signum(shares1.GetWeight(resourceOrder1[i]) - shares2.GetWeight
                                        (resourceOrder2[i]));
         if (ret != 0)
         {
             return(ret);
         }
     }
     return(0);
 }
        public virtual void TestCalculateShares()
        {
            Org.Apache.Hadoop.Yarn.Api.Records.Resource used = Resources.CreateResource(10, 5
                                                                                        );
            Org.Apache.Hadoop.Yarn.Api.Records.Resource capacity = Resources.CreateResource(100
                                                                                            , 10);
            ResourceType[]  resourceOrder = new ResourceType[2];
            ResourceWeights shares        = new ResourceWeights();

            DominantResourceFairnessPolicy.DominantResourceFairnessComparator comparator = new
                                                                                           DominantResourceFairnessPolicy.DominantResourceFairnessComparator();
            comparator.CalculateShares(used, capacity, shares, resourceOrder, ResourceWeights
                                       .Neutral);
            NUnit.Framework.Assert.AreEqual(.1, shares.GetWeight(ResourceType.Memory), .00001
                                            );
            NUnit.Framework.Assert.AreEqual(.5, shares.GetWeight(ResourceType.Cpu), .00001);
            NUnit.Framework.Assert.AreEqual(ResourceType.Cpu, resourceOrder[0]);
            NUnit.Framework.Assert.AreEqual(ResourceType.Memory, resourceOrder[1]);
        }
 /// <summary>Calculates and orders a resource's share of a pool in terms of two vectors.
 ///     </summary>
 /// <remarks>
 /// Calculates and orders a resource's share of a pool in terms of two vectors.
 /// The shares vector contains, for each resource, the fraction of the pool that
 /// it takes up.  The resourceOrder vector contains an ordering of resources
 /// by largest share.  So if resource=<10 MB, 5 CPU>, and pool=<100 MB, 10 CPU>,
 /// shares will be [.1, .5] and resourceOrder will be [CPU, MEMORY].
 /// </remarks>
 internal virtual void CalculateShares(Org.Apache.Hadoop.Yarn.Api.Records.Resource
                                       resource, Org.Apache.Hadoop.Yarn.Api.Records.Resource pool, ResourceWeights shares
                                       , ResourceType[] resourceOrder, ResourceWeights weights)
 {
     shares.SetWeight(ResourceType.Memory, (float)resource.GetMemory() / (pool.GetMemory
                                                                              () * weights.GetWeight(ResourceType.Memory)));
     shares.SetWeight(ResourceType.Cpu, (float)resource.GetVirtualCores() / (pool.GetVirtualCores
                                                                                 () * weights.GetWeight(ResourceType.Cpu)));
     // sort order vector by resource share
     if (resourceOrder != null)
     {
         if (shares.GetWeight(ResourceType.Memory) > shares.GetWeight(ResourceType.Cpu))
         {
             resourceOrder[0] = ResourceType.Memory;
             resourceOrder[1] = ResourceType.Cpu;
         }
         else
         {
             resourceOrder[0] = ResourceType.Cpu;
             resourceOrder[1] = ResourceType.Memory;
         }
     }
 }
        /// <summary>Loads a queue from a queue element in the configuration file</summary>
        /// <exception cref="Org.Apache.Hadoop.Yarn.Server.Resourcemanager.Scheduler.Fair.AllocationConfigurationException
        ///     "/>
        private void LoadQueue(string parentName, Element element, IDictionary <string, Org.Apache.Hadoop.Yarn.Api.Records.Resource
                                                                                > minQueueResources, IDictionary <string, Org.Apache.Hadoop.Yarn.Api.Records.Resource
                                                                                                                  > maxQueueResources, IDictionary <string, int> queueMaxApps, IDictionary <string,
                                                                                                                                                                                            int> userMaxApps, IDictionary <string, float> queueMaxAMShares, IDictionary <string
                                                                                                                                                                                                                                                                         , ResourceWeights> queueWeights, IDictionary <string, SchedulingPolicy> queuePolicies
                               , IDictionary <string, long> minSharePreemptionTimeouts, IDictionary <string, long
                                                                                                     > fairSharePreemptionTimeouts, IDictionary <string, float> fairSharePreemptionThresholds
                               , IDictionary <string, IDictionary <QueueACL, AccessControlList> > queueAcls, IDictionary
                               <FSQueueType, ICollection <string> > configuredQueues, ICollection <string> reservableQueues
                               )
        {
            string queueName = element.GetAttribute("name");

            if (queueName.Contains("."))
            {
                throw new AllocationConfigurationException("Bad fair scheduler config " + "file: queue name ("
                                                           + queueName + ") shouldn't contain period.");
            }
            if (parentName != null)
            {
                queueName = parentName + "." + queueName;
            }
            IDictionary <QueueACL, AccessControlList> acls = new Dictionary <QueueACL, AccessControlList
                                                                             >();
            NodeList fields = element.GetChildNodes();
            bool     isLeaf = true;

            for (int j = 0; j < fields.GetLength(); j++)
            {
                Node fieldNode = fields.Item(j);
                if (!(fieldNode is Element))
                {
                    continue;
                }
                Element field = (Element)fieldNode;
                if ("minResources".Equals(field.GetTagName()))
                {
                    string text = ((Text)field.GetFirstChild()).GetData().Trim();
                    Org.Apache.Hadoop.Yarn.Api.Records.Resource val = FairSchedulerConfiguration.ParseResourceConfigValue
                                                                          (text);
                    minQueueResources[queueName] = val;
                }
                else
                {
                    if ("maxResources".Equals(field.GetTagName()))
                    {
                        string text = ((Text)field.GetFirstChild()).GetData().Trim();
                        Org.Apache.Hadoop.Yarn.Api.Records.Resource val = FairSchedulerConfiguration.ParseResourceConfigValue
                                                                              (text);
                        maxQueueResources[queueName] = val;
                    }
                    else
                    {
                        if ("maxRunningApps".Equals(field.GetTagName()))
                        {
                            string text = ((Text)field.GetFirstChild()).GetData().Trim();
                            int    val  = System.Convert.ToInt32(text);
                            queueMaxApps[queueName] = val;
                        }
                        else
                        {
                            if ("maxAMShare".Equals(field.GetTagName()))
                            {
                                string text = ((Text)field.GetFirstChild()).GetData().Trim();
                                float  val  = float.ParseFloat(text);
                                val = Math.Min(val, 1.0f);
                                queueMaxAMShares[queueName] = val;
                            }
                            else
                            {
                                if ("weight".Equals(field.GetTagName()))
                                {
                                    string text = ((Text)field.GetFirstChild()).GetData().Trim();
                                    double val  = double.ParseDouble(text);
                                    queueWeights[queueName] = new ResourceWeights((float)val);
                                }
                                else
                                {
                                    if ("minSharePreemptionTimeout".Equals(field.GetTagName()))
                                    {
                                        string text = ((Text)field.GetFirstChild()).GetData().Trim();
                                        long   val  = long.Parse(text) * 1000L;
                                        minSharePreemptionTimeouts[queueName] = val;
                                    }
                                    else
                                    {
                                        if ("fairSharePreemptionTimeout".Equals(field.GetTagName()))
                                        {
                                            string text = ((Text)field.GetFirstChild()).GetData().Trim();
                                            long   val  = long.Parse(text) * 1000L;
                                            fairSharePreemptionTimeouts[queueName] = val;
                                        }
                                        else
                                        {
                                            if ("fairSharePreemptionThreshold".Equals(field.GetTagName()))
                                            {
                                                string text = ((Text)field.GetFirstChild()).GetData().Trim();
                                                float  val  = float.ParseFloat(text);
                                                val = Math.Max(Math.Min(val, 1.0f), 0.0f);
                                                fairSharePreemptionThresholds[queueName] = val;
                                            }
                                            else
                                            {
                                                if ("schedulingPolicy".Equals(field.GetTagName()) || "schedulingMode".Equals(field
                                                                                                                             .GetTagName()))
                                                {
                                                    string           text   = ((Text)field.GetFirstChild()).GetData().Trim();
                                                    SchedulingPolicy policy = SchedulingPolicy.Parse(text);
                                                    queuePolicies[queueName] = policy;
                                                }
                                                else
                                                {
                                                    if ("aclSubmitApps".Equals(field.GetTagName()))
                                                    {
                                                        string text = ((Text)field.GetFirstChild()).GetData();
                                                        acls[QueueACL.SubmitApplications] = new AccessControlList(text);
                                                    }
                                                    else
                                                    {
                                                        if ("aclAdministerApps".Equals(field.GetTagName()))
                                                        {
                                                            string text = ((Text)field.GetFirstChild()).GetData();
                                                            acls[QueueACL.AdministerQueue] = new AccessControlList(text);
                                                        }
                                                        else
                                                        {
                                                            if ("reservation".Equals(field.GetTagName()))
                                                            {
                                                                isLeaf = false;
                                                                reservableQueues.AddItem(queueName);
                                                                configuredQueues[FSQueueType.Parent].AddItem(queueName);
                                                            }
                                                            else
                                                            {
                                                                if ("queue".EndsWith(field.GetTagName()) || "pool".Equals(field.GetTagName()))
                                                                {
                                                                    LoadQueue(queueName, field, minQueueResources, maxQueueResources, queueMaxApps, userMaxApps
                                                                              , queueMaxAMShares, queueWeights, queuePolicies, minSharePreemptionTimeouts, fairSharePreemptionTimeouts
                                                                              , fairSharePreemptionThresholds, queueAcls, configuredQueues, reservableQueues);
                                                                    isLeaf = false;
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            if (isLeaf)
            {
                // if a leaf in the alloc file is marked as type='parent'
                // then store it under 'parent'
                if ("parent".Equals(element.GetAttribute("type")))
                {
                    configuredQueues[FSQueueType.Parent].AddItem(queueName);
                }
                else
                {
                    configuredQueues[FSQueueType.Leaf].AddItem(queueName);
                }
            }
            else
            {
                if ("parent".Equals(element.GetAttribute("type")))
                {
                    throw new AllocationConfigurationException("Both <reservation> and " + "type=\"parent\" found for queue "
                                                               + queueName + " which is " + "unsupported");
                }
                configuredQueues[FSQueueType.Parent].AddItem(queueName);
            }
            queueAcls[queueName] = acls;
            if (maxQueueResources.Contains(queueName) && minQueueResources.Contains(queueName
                                                                                    ) && !Resources.FitsIn(minQueueResources[queueName], maxQueueResources[queueName
                                                                                                           ]))
            {
                Log.Warn(string.Format("Queue %s has max resources %s less than min resources %s"
                                       , queueName, maxQueueResources[queueName], minQueueResources[queueName]));
            }
        }
Пример #9
0
 public FakeSchedulable(Org.Apache.Hadoop.Yarn.Api.Records.Resource minShare, ResourceWeights
                        weights)
     : this(minShare, Resources.CreateResource(int.MaxValue, int.MaxValue), weights, Resources
            .CreateResource(0, 0), Resources.CreateResource(0, 0), 0)
 {
 }
Пример #10
0
 public virtual void SetQueueWeight(string queue, ResourceWeights weight)
 {
     queueWeights[queue] = weight;
 }
Пример #11
0
        public virtual ResourceWeights GetQueueWeight(string queue)
        {
            ResourceWeights weight = queueWeights[queue];

            return((weight == null) ? ResourceWeights.Neutral : weight);
        }
 private Schedulable CreateSchedulable(int memUsage, int cpuUsage, ResourceWeights
                                       weights)
 {
     return(CreateSchedulable(memUsage, cpuUsage, weights, 0, 0));
 }