1 /**
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements.  See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership.  The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License.  You may obtain a copy of the License at
9 *
10 *     http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18 package org.apache.hadoop.yarn.util.resource;
19 
20 import org.apache.hadoop.classification.InterfaceAudience.Private;
21 import org.apache.hadoop.classification.InterfaceStability.Unstable;
22 import org.apache.hadoop.yarn.api.records.Resource;
23 
24 @Private
25 @Unstable
26 public class DefaultResourceCalculator extends ResourceCalculator {
27 
28   @Override
compare(Resource unused, Resource lhs, Resource rhs)29   public int compare(Resource unused, Resource lhs, Resource rhs) {
30     // Only consider memory
31     return lhs.getMemory() - rhs.getMemory();
32   }
33 
34   @Override
computeAvailableContainers(Resource available, Resource required)35   public int computeAvailableContainers(Resource available, Resource required) {
36     // Only consider memory
37     return available.getMemory() / required.getMemory();
38   }
39 
40   @Override
divide(Resource unused, Resource numerator, Resource denominator)41   public float divide(Resource unused,
42       Resource numerator, Resource denominator) {
43     return ratio(numerator, denominator);
44   }
45 
isInvalidDivisor(Resource r)46   public boolean isInvalidDivisor(Resource r) {
47     if (r.getMemory() == 0.0f) {
48       return true;
49     }
50     return false;
51   }
52 
53   @Override
ratio(Resource a, Resource b)54   public float ratio(Resource a, Resource b) {
55     return (float)a.getMemory() / b.getMemory();
56   }
57 
58   @Override
divideAndCeil(Resource numerator, int denominator)59   public Resource divideAndCeil(Resource numerator, int denominator) {
60     return Resources.createResource(
61         divideAndCeil(numerator.getMemory(), denominator));
62   }
63 
64   @Override
normalize(Resource r, Resource minimumResource, Resource maximumResource, Resource stepFactor)65   public Resource normalize(Resource r, Resource minimumResource,
66       Resource maximumResource, Resource stepFactor) {
67     int normalizedMemory = Math.min(
68         roundUp(
69             Math.max(r.getMemory(), minimumResource.getMemory()),
70             stepFactor.getMemory()),
71             maximumResource.getMemory());
72     return Resources.createResource(normalizedMemory);
73   }
74 
75   @Override
normalize(Resource r, Resource minimumResource, Resource maximumResource)76   public Resource normalize(Resource r, Resource minimumResource,
77                             Resource maximumResource) {
78     return normalize(r, minimumResource, maximumResource, minimumResource);
79   }
80 
81   @Override
roundUp(Resource r, Resource stepFactor)82   public Resource roundUp(Resource r, Resource stepFactor) {
83     return Resources.createResource(
84         roundUp(r.getMemory(), stepFactor.getMemory())
85         );
86   }
87 
88   @Override
roundDown(Resource r, Resource stepFactor)89   public Resource roundDown(Resource r, Resource stepFactor) {
90     return Resources.createResource(
91         roundDown(r.getMemory(), stepFactor.getMemory()));
92   }
93 
94   @Override
multiplyAndNormalizeUp(Resource r, double by, Resource stepFactor)95   public Resource multiplyAndNormalizeUp(Resource r, double by,
96       Resource stepFactor) {
97     return Resources.createResource(
98         roundUp((int)(r.getMemory() * by + 0.5), stepFactor.getMemory())
99         );
100   }
101 
102   @Override
multiplyAndNormalizeDown(Resource r, double by, Resource stepFactor)103   public Resource multiplyAndNormalizeDown(Resource r, double by,
104       Resource stepFactor) {
105     return Resources.createResource(
106         roundDown(
107             (int)(r.getMemory() * by),
108             stepFactor.getMemory()
109             )
110         );
111   }
112 
113 }
114