Class DominantResourceCalculator
java.lang.Object
org.apache.hadoop.yarn.util.resource.ResourceCalculator
org.apache.hadoop.yarn.util.resource.DominantResourceCalculator
A
ResourceCalculator which uses the concept of
dominant resource to compare multi-dimensional resources.
Essentially the idea is that the in a multi-resource environment,
the resource allocation should be determined by the dominant share
of an entity (user or queue), which is the maximum share that the
entity has been allocated of any resource.
In a nutshell, it seeks to maximize the minimum dominant share across
all entities.
For example, if user A runs CPU-heavy tasks and user B runs
memory-heavy tasks, it attempts to equalize CPU share of user A
with Memory-share of user B.
In the single resource case, it reduces to max-min fairness for that resource.
See the Dominant Resource Fairness paper for more details:
www.cs.berkeley.edu/~matei/papers/2011/nsdi_drf.pdf-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionintcompare(org.apache.hadoop.yarn.api.records.Resource clusterResource, org.apache.hadoop.yarn.api.records.Resource lhs, org.apache.hadoop.yarn.api.records.Resource rhs, boolean singleType) On a cluster with capacityclusterResource, comparelhsandrhs.longcomputeAvailableContainers(org.apache.hadoop.yarn.api.records.Resource available, org.apache.hadoop.yarn.api.records.Resource required) Compute the number of containers which can be allocated givenavailableandrequiredresources.floatdivide(org.apache.hadoop.yarn.api.records.Resource clusterResource, org.apache.hadoop.yarn.api.records.Resource numerator, org.apache.hadoop.yarn.api.records.Resource denominator) Divide resourcenumeratorby resourcedenominatorusing specified policy (domination, average, fairness etc.); hence overallclusterResourceis provided for context.org.apache.hadoop.yarn.api.records.ResourcedivideAndCeil(org.apache.hadoop.yarn.api.records.Resource numerator, float denominator) Divide-and-ceilnumeratorbydenominator.org.apache.hadoop.yarn.api.records.ResourcedivideAndCeil(org.apache.hadoop.yarn.api.records.Resource numerator, int denominator) Divide-and-ceilnumeratorbydenominator.org.apache.hadoop.yarn.api.records.ResourcedivideAndCeil(org.apache.hadoop.yarn.api.records.Resource numerator, long denominator) booleanfitsIn(org.apache.hadoop.yarn.api.records.Resource smaller, org.apache.hadoop.yarn.api.records.Resource bigger) Check if a smaller resource can be contained by bigger resource.getInsufficientResourceNames(org.apache.hadoop.yarn.api.records.Resource required, org.apache.hadoop.yarn.api.records.Resource available) Get insufficient resource names via comparing required resource and capacity resource.booleanisAllInvalidDivisor(org.apache.hadoop.yarn.api.records.Resource r) Determine if all resources are zero.booleanisAnyMajorResourceAboveZero(org.apache.hadoop.yarn.api.records.Resource resource) Check if resource has any major resource types (which are all NodeManagers included) has a > 0 value.booleanisAnyMajorResourceZeroOrNegative(org.apache.hadoop.yarn.api.records.Resource resource) Check if resource has any major resource types (which are all NodeManagers included) a zero value or negative value.booleanisInvalidDivisor(org.apache.hadoop.yarn.api.records.Resource r) Determine if a resource is not suitable for use as a divisor (will result in divide by 0, etc)floatminRatio(org.apache.hadoop.yarn.api.records.Resource a, org.apache.hadoop.yarn.api.records.Resource b) Computes the ratio of resource a over resource b.org.apache.hadoop.yarn.api.records.ResourcemultiplyAndNormalizeDown(org.apache.hadoop.yarn.api.records.Resource r, double by, org.apache.hadoop.yarn.api.records.Resource stepFactor) Multiply resourcerby factorbyand normalize down using step-factorstepFactor.org.apache.hadoop.yarn.api.records.ResourcemultiplyAndNormalizeUp(org.apache.hadoop.yarn.api.records.Resource r, double[] by, org.apache.hadoop.yarn.api.records.Resource stepFactor) Multiply resourcerby factorbyand normalize up using step-factorstepFactor.org.apache.hadoop.yarn.api.records.ResourcemultiplyAndNormalizeUp(org.apache.hadoop.yarn.api.records.Resource r, double by, org.apache.hadoop.yarn.api.records.Resource stepFactor) Multiply resourcerby factorbyand normalize up using step-factorstepFactor.org.apache.hadoop.yarn.api.records.Resourcenormalize(org.apache.hadoop.yarn.api.records.Resource r, org.apache.hadoop.yarn.api.records.Resource minimumResource, org.apache.hadoop.yarn.api.records.Resource maximumResource, org.apache.hadoop.yarn.api.records.Resource stepFactor) Normalize resourcergiven the baseminimumResourceand verify against max allowedmaximumResourceusing a step factor for the normalization.org.apache.hadoop.yarn.api.records.ResourcenormalizeDown(org.apache.hadoop.yarn.api.records.Resource r, org.apache.hadoop.yarn.api.records.Resource stepFactor) Get resourcerand normalize down using step-factorstepFactor.floatratio(org.apache.hadoop.yarn.api.records.Resource a, org.apache.hadoop.yarn.api.records.Resource b) Ratio of resourceato resourceb.org.apache.hadoop.yarn.api.records.ResourceroundDown(org.apache.hadoop.yarn.api.records.Resource r, org.apache.hadoop.yarn.api.records.Resource stepFactor) Round-down resourcergiven factorstepFactor.org.apache.hadoop.yarn.api.records.ResourceroundUp(org.apache.hadoop.yarn.api.records.Resource r, org.apache.hadoop.yarn.api.records.Resource stepFactor) Round-up resourcergiven factorstepFactor.Methods inherited from class org.apache.hadoop.yarn.util.resource.ResourceCalculator
compare, divideAndCeil, divideAndCeil, divideAndCeil, divideAndCeil, divideSafelyAsFloat, roundDown, roundDown, roundUp, roundUp
-
Constructor Details
-
DominantResourceCalculator
public DominantResourceCalculator()
-
-
Method Details
-
compare
public int compare(org.apache.hadoop.yarn.api.records.Resource clusterResource, org.apache.hadoop.yarn.api.records.Resource lhs, org.apache.hadoop.yarn.api.records.Resource rhs, boolean singleType) Description copied from class:ResourceCalculatorOn a cluster with capacityclusterResource, comparelhsandrhs. Consider all resources unlesssingleTypeis set to true. WhensingleTypeis set to true, consider only one resource as per theResourceCalculatorimplementation; theDefaultResourceCalculatorconsiders memory andDominantResourceCalculatorconsiders the dominant resource.- Specified by:
comparein classResourceCalculator- Parameters:
clusterResource- cluster capacitylhs- FirstResourceto comparerhs- SecondResourceto comparesingleType- Whether to consider a single resource type or all resource types- Returns:
- -1 if
lhsis smaller, 0 if equal and 1 if it is larger
-
computeAvailableContainers
public long computeAvailableContainers(org.apache.hadoop.yarn.api.records.Resource available, org.apache.hadoop.yarn.api.records.Resource required) Description copied from class:ResourceCalculatorCompute the number of containers which can be allocated givenavailableandrequiredresources.- Specified by:
computeAvailableContainersin classResourceCalculator- Parameters:
available- available resourcesrequired- required resources- Returns:
- number of containers which can be allocated
-
divide
public float divide(org.apache.hadoop.yarn.api.records.Resource clusterResource, org.apache.hadoop.yarn.api.records.Resource numerator, org.apache.hadoop.yarn.api.records.Resource denominator) Description copied from class:ResourceCalculatorDivide resourcenumeratorby resourcedenominatorusing specified policy (domination, average, fairness etc.); hence overallclusterResourceis provided for context.- Specified by:
dividein classResourceCalculator- Parameters:
clusterResource- cluster resourcesnumerator- numeratordenominator- denominator- Returns:
numerator/denominatorusing specific policy
-
isInvalidDivisor
public boolean isInvalidDivisor(org.apache.hadoop.yarn.api.records.Resource r) Description copied from class:ResourceCalculatorDetermine if a resource is not suitable for use as a divisor (will result in divide by 0, etc)- Specified by:
isInvalidDivisorin classResourceCalculator- Parameters:
r- resource- Returns:
- true if divisor is invalid (should not be used), false else
-
isAllInvalidDivisor
public boolean isAllInvalidDivisor(org.apache.hadoop.yarn.api.records.Resource r) Description copied from class:ResourceCalculatorDetermine if all resources are zero.- Specified by:
isAllInvalidDivisorin classResourceCalculator- Parameters:
r- resource- Returns:
- true if all divisors are invalid (should not be used), false else
-
ratio
public float ratio(org.apache.hadoop.yarn.api.records.Resource a, org.apache.hadoop.yarn.api.records.Resource b) Description copied from class:ResourceCalculatorRatio of resourceato resourceb.- Specified by:
ratioin classResourceCalculator- Parameters:
a- resourceb- resource- Returns:
- ratio of resource
ato resourceb
-
minRatio
@Unstable public float minRatio(org.apache.hadoop.yarn.api.records.Resource a, org.apache.hadoop.yarn.api.records.Resource b) Computes the ratio of resource a over resource b. However, different from ratio(Resource, Resource), this returns the min-share of the resources. For example, ratio(Resource(10, 50), Resource(100, 100)) would return 0.5, whereas minRatio(Resource(10, 50), Resource(100, 100)) would return 0.1.- Parameters:
a- the numerator resource.b- the denominator resource.- Returns:
- the min-share ratio of the resources.
-
divideAndCeil
public org.apache.hadoop.yarn.api.records.Resource divideAndCeil(org.apache.hadoop.yarn.api.records.Resource numerator, int denominator) Description copied from class:ResourceCalculatorDivide-and-ceilnumeratorbydenominator.- Specified by:
divideAndCeilin classResourceCalculator- Parameters:
numerator- numerator resourcedenominator- denominator- Returns:
- resultant resource
-
divideAndCeil
public org.apache.hadoop.yarn.api.records.Resource divideAndCeil(org.apache.hadoop.yarn.api.records.Resource numerator, long denominator) -
divideAndCeil
public org.apache.hadoop.yarn.api.records.Resource divideAndCeil(org.apache.hadoop.yarn.api.records.Resource numerator, float denominator) Description copied from class:ResourceCalculatorDivide-and-ceilnumeratorbydenominator.- Specified by:
divideAndCeilin classResourceCalculator- Parameters:
numerator- numerator resourcedenominator- denominator- Returns:
- resultant resource
-
normalize
public org.apache.hadoop.yarn.api.records.Resource normalize(org.apache.hadoop.yarn.api.records.Resource r, org.apache.hadoop.yarn.api.records.Resource minimumResource, org.apache.hadoop.yarn.api.records.Resource maximumResource, org.apache.hadoop.yarn.api.records.Resource stepFactor) Description copied from class:ResourceCalculatorNormalize resourcergiven the baseminimumResourceand verify against max allowedmaximumResourceusing a step factor for the normalization.- Specified by:
normalizein classResourceCalculator- Parameters:
r- resourceminimumResource- minimum valuemaximumResource- the upper bound of the resource to be allocatedstepFactor- the increment for resources to be allocated- Returns:
- normalized resource
-
roundUp
public org.apache.hadoop.yarn.api.records.Resource roundUp(org.apache.hadoop.yarn.api.records.Resource r, org.apache.hadoop.yarn.api.records.Resource stepFactor) Description copied from class:ResourceCalculatorRound-up resourcergiven factorstepFactor.- Specified by:
roundUpin classResourceCalculator- Parameters:
r- resourcestepFactor- step-factor- Returns:
- rounded resource
-
roundDown
public org.apache.hadoop.yarn.api.records.Resource roundDown(org.apache.hadoop.yarn.api.records.Resource r, org.apache.hadoop.yarn.api.records.Resource stepFactor) Description copied from class:ResourceCalculatorRound-down resourcergiven factorstepFactor.- Specified by:
roundDownin classResourceCalculator- Parameters:
r- resourcestepFactor- step-factor- Returns:
- rounded resource
-
multiplyAndNormalizeUp
public org.apache.hadoop.yarn.api.records.Resource multiplyAndNormalizeUp(org.apache.hadoop.yarn.api.records.Resource r, double[] by, org.apache.hadoop.yarn.api.records.Resource stepFactor) Description copied from class:ResourceCalculatorMultiply resourcerby factorbyand normalize up using step-factorstepFactor.- Specified by:
multiplyAndNormalizeUpin classResourceCalculator- Parameters:
r- resource to be multipliedby- multiplier array for all resource typesstepFactor- factor by which to normalize up- Returns:
- resulting normalized resource
-
multiplyAndNormalizeUp
public org.apache.hadoop.yarn.api.records.Resource multiplyAndNormalizeUp(org.apache.hadoop.yarn.api.records.Resource r, double by, org.apache.hadoop.yarn.api.records.Resource stepFactor) Description copied from class:ResourceCalculatorMultiply resourcerby factorbyand normalize up using step-factorstepFactor.- Specified by:
multiplyAndNormalizeUpin classResourceCalculator- Parameters:
r- resource to be multipliedby- multiplierstepFactor- factor by which to normalize up- Returns:
- resulting normalized resource
-
multiplyAndNormalizeDown
public org.apache.hadoop.yarn.api.records.Resource multiplyAndNormalizeDown(org.apache.hadoop.yarn.api.records.Resource r, double by, org.apache.hadoop.yarn.api.records.Resource stepFactor) Description copied from class:ResourceCalculatorMultiply resourcerby factorbyand normalize down using step-factorstepFactor.- Specified by:
multiplyAndNormalizeDownin classResourceCalculator- Parameters:
r- resource to be multipliedby- multiplierstepFactor- factor by which to normalize down- Returns:
- resulting normalized resource
-
fitsIn
public boolean fitsIn(org.apache.hadoop.yarn.api.records.Resource smaller, org.apache.hadoop.yarn.api.records.Resource bigger) Description copied from class:ResourceCalculatorCheck if a smaller resource can be contained by bigger resource.- Specified by:
fitsInin classResourceCalculator- Parameters:
smaller- smaller resource.bigger- bigger resource.- Returns:
- if true, smaller resource can be contained by bigger resource; false otherwise.
-
normalizeDown
public org.apache.hadoop.yarn.api.records.Resource normalizeDown(org.apache.hadoop.yarn.api.records.Resource r, org.apache.hadoop.yarn.api.records.Resource stepFactor) Description copied from class:ResourceCalculatorGet resourcerand normalize down using step-factorstepFactor.- Specified by:
normalizeDownin classResourceCalculator- Parameters:
r- resource to be multipliedstepFactor- factor by which to normalize down- Returns:
- resulting normalized resource
-
isAnyMajorResourceZeroOrNegative
public boolean isAnyMajorResourceZeroOrNegative(org.apache.hadoop.yarn.api.records.Resource resource) Description copied from class:ResourceCalculatorCheck if resource has any major resource types (which are all NodeManagers included) a zero value or negative value.- Specified by:
isAnyMajorResourceZeroOrNegativein classResourceCalculator- Parameters:
resource- resource- Returns:
- returns true if any resource is zero.
-
isAnyMajorResourceAboveZero
public boolean isAnyMajorResourceAboveZero(org.apache.hadoop.yarn.api.records.Resource resource) Description copied from class:ResourceCalculatorCheck if resource has any major resource types (which are all NodeManagers included) has a > 0 value.- Specified by:
isAnyMajorResourceAboveZeroin classResourceCalculator- Parameters:
resource- resource- Returns:
- returns true if any resource is > 0
-
getInsufficientResourceNames
public Set<String> getInsufficientResourceNames(org.apache.hadoop.yarn.api.records.Resource required, org.apache.hadoop.yarn.api.records.Resource available) Description copied from class:ResourceCalculatorGet insufficient resource names via comparing required resource and capacity resource.- Specified by:
getInsufficientResourceNamesin classResourceCalculator- Parameters:
required- - required resourceavailable- - available resource- Returns:
- insufficient resource names
-