YARN-7030. [YARN-3926] Performance optimizations in Resource and ResourceUtils class. Contributed by Wangda Tan.
(cherry picked from commit a6989af1d9
)
This commit is contained in:
parent
2fafdc7f8b
commit
7b1c58b037
|
@ -65,7 +65,7 @@ public abstract class Resource implements Comparable<Resource> {
|
||||||
@Public
|
@Public
|
||||||
@Stable
|
@Stable
|
||||||
public static Resource newInstance(int memory, int vCores) {
|
public static Resource newInstance(int memory, int vCores) {
|
||||||
if (ResourceUtils.getResourceTypesArray().length > 2) {
|
if (ResourceUtils.getNumberOfKnownResourceTypes() > 2) {
|
||||||
Resource ret = Records.newRecord(Resource.class);
|
Resource ret = Records.newRecord(Resource.class);
|
||||||
ret.setMemorySize(memory);
|
ret.setMemorySize(memory);
|
||||||
ret.setVirtualCores(vCores);
|
ret.setVirtualCores(vCores);
|
||||||
|
@ -77,7 +77,7 @@ public abstract class Resource implements Comparable<Resource> {
|
||||||
@Public
|
@Public
|
||||||
@Stable
|
@Stable
|
||||||
public static Resource newInstance(long memory, int vCores) {
|
public static Resource newInstance(long memory, int vCores) {
|
||||||
if (ResourceUtils.getResourceTypesArray().length > 2) {
|
if (ResourceUtils.getNumberOfKnownResourceTypes() > 2) {
|
||||||
Resource ret = Records.newRecord(Resource.class);
|
Resource ret = Records.newRecord(Resource.class);
|
||||||
ret.setMemorySize(memory);
|
ret.setMemorySize(memory);
|
||||||
ret.setVirtualCores(vCores);
|
ret.setVirtualCores(vCores);
|
||||||
|
@ -91,7 +91,7 @@ public abstract class Resource implements Comparable<Resource> {
|
||||||
public static Resource newInstance(Resource resource) {
|
public static Resource newInstance(Resource resource) {
|
||||||
Resource ret = Resource.newInstance(resource.getMemorySize(),
|
Resource ret = Resource.newInstance(resource.getMemorySize(),
|
||||||
resource.getVirtualCores());
|
resource.getVirtualCores());
|
||||||
if (ResourceUtils.getResourceTypesArray().length > 2) {
|
if (ResourceUtils.getNumberOfKnownResourceTypes() > 2) {
|
||||||
Resource.copy(resource, ret);
|
Resource.copy(resource, ret);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -63,6 +63,11 @@ public class BaseResource extends Resource {
|
||||||
protected ResourceInformation[] resources = null;
|
protected ResourceInformation[] resources = null;
|
||||||
protected ResourceInformation[] readOnlyResources = null;
|
protected ResourceInformation[] readOnlyResources = null;
|
||||||
|
|
||||||
|
// Number of mandatory resources, this is added to avoid invoke
|
||||||
|
// MandatoryResources.values().length, since values() internally will
|
||||||
|
// copy array, etc.
|
||||||
|
private static final int NUM_MANDATORY_RESOURCES = 2;
|
||||||
|
|
||||||
protected enum MandatoryResources {
|
protected enum MandatoryResources {
|
||||||
MEMORY(0), VCORES(1);
|
MEMORY(0), VCORES(1);
|
||||||
|
|
||||||
|
@ -86,9 +91,8 @@ public class BaseResource extends Resource {
|
||||||
ResourceInformation.MEMORY_MB.getUnits(), memory);
|
ResourceInformation.MEMORY_MB.getUnits(), memory);
|
||||||
this.vcoresResInfo = ResourceInformation.newInstance(VCORES, "", vcores);
|
this.vcoresResInfo = ResourceInformation.newInstance(VCORES, "", vcores);
|
||||||
|
|
||||||
resources = new ResourceInformation[MandatoryResources.values().length];
|
resources = new ResourceInformation[NUM_MANDATORY_RESOURCES];
|
||||||
readOnlyResources = new ResourceInformation[MandatoryResources
|
readOnlyResources = new ResourceInformation[NUM_MANDATORY_RESOURCES];
|
||||||
.values().length];
|
|
||||||
resources[MandatoryResources.MEMORY.id] = memoryResInfo;
|
resources[MandatoryResources.MEMORY.id] = memoryResInfo;
|
||||||
resources[MandatoryResources.VCORES.id] = vcoresResInfo;
|
resources[MandatoryResources.VCORES.id] = vcoresResInfo;
|
||||||
readOnlyResources = Arrays.copyOf(resources, resources.length);
|
readOnlyResources = Arrays.copyOf(resources, resources.length);
|
||||||
|
|
|
@ -74,6 +74,7 @@ public class ResourceUtils {
|
||||||
private static volatile ResourceInformation[] resourceTypesArray;
|
private static volatile ResourceInformation[] resourceTypesArray;
|
||||||
private static volatile boolean initializedNodeResources = false;
|
private static volatile boolean initializedNodeResources = false;
|
||||||
private static volatile Map<String, ResourceInformation> readOnlyNodeResources;
|
private static volatile Map<String, ResourceInformation> readOnlyNodeResources;
|
||||||
|
private static volatile int numKnownResourceTypes = -1;
|
||||||
|
|
||||||
static final Log LOG = LogFactory.getLog(ResourceUtils.class);
|
static final Log LOG = LogFactory.getLog(ResourceUtils.class);
|
||||||
|
|
||||||
|
@ -308,23 +309,33 @@ public class ResourceUtils {
|
||||||
* @return resourceNamesArray
|
* @return resourceNamesArray
|
||||||
*/
|
*/
|
||||||
public static String[] getResourceNamesArray() {
|
public static String[] getResourceNamesArray() {
|
||||||
getResourceTypes(null, YarnConfiguration.RESOURCE_TYPES_CONFIGURATION_FILE);
|
initializeResourceTypesIfNeeded(null,
|
||||||
|
YarnConfiguration.RESOURCE_TYPES_CONFIGURATION_FILE);
|
||||||
return resourceNamesArray;
|
return resourceNamesArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ResourceInformation[] getResourceTypesArray() {
|
public static ResourceInformation[] getResourceTypesArray() {
|
||||||
getResourceTypes(null, YarnConfiguration.RESOURCE_TYPES_CONFIGURATION_FILE);
|
initializeResourceTypesIfNeeded(null,
|
||||||
|
YarnConfiguration.RESOURCE_TYPES_CONFIGURATION_FILE);
|
||||||
return resourceTypesArray;
|
return resourceTypesArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int getNumberOfKnownResourceTypes() {
|
||||||
|
if (numKnownResourceTypes < 0) {
|
||||||
|
initializeResourceTypesIfNeeded(null,
|
||||||
|
YarnConfiguration.RESOURCE_TYPES_CONFIGURATION_FILE);
|
||||||
|
}
|
||||||
|
return numKnownResourceTypes;
|
||||||
|
}
|
||||||
|
|
||||||
private static Map<String, ResourceInformation> getResourceTypes(
|
private static Map<String, ResourceInformation> getResourceTypes(
|
||||||
Configuration conf) {
|
Configuration conf) {
|
||||||
return getResourceTypes(conf,
|
return getResourceTypes(conf,
|
||||||
YarnConfiguration.RESOURCE_TYPES_CONFIGURATION_FILE);
|
YarnConfiguration.RESOURCE_TYPES_CONFIGURATION_FILE);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Map<String, ResourceInformation> getResourceTypes(
|
private static void initializeResourceTypesIfNeeded(Configuration conf,
|
||||||
Configuration conf, String resourceFile) {
|
String resourceFile) {
|
||||||
if (!initializedResources) {
|
if (!initializedResources) {
|
||||||
synchronized (ResourceUtils.class) {
|
synchronized (ResourceUtils.class) {
|
||||||
if (!initializedResources) {
|
if (!initializedResources) {
|
||||||
|
@ -346,6 +357,12 @@ public class ResourceUtils {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
numKnownResourceTypes = resourceTypes.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map<String, ResourceInformation> getResourceTypes(
|
||||||
|
Configuration conf, String resourceFile) {
|
||||||
|
initializeResourceTypesIfNeeded(conf, resourceFile);
|
||||||
return resourceTypes;
|
return resourceTypes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -173,7 +173,7 @@ public class Resources {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Resource addTo(Resource lhs, Resource rhs) {
|
public static Resource addTo(Resource lhs, Resource rhs) {
|
||||||
int maxLength = ResourceUtils.getResourceTypesArray().length;
|
int maxLength = ResourceUtils.getNumberOfKnownResourceTypes();
|
||||||
for (int i = 0; i < maxLength; i++) {
|
for (int i = 0; i < maxLength; i++) {
|
||||||
try {
|
try {
|
||||||
ResourceInformation rhsValue = rhs.getResourceInformation(i);
|
ResourceInformation rhsValue = rhs.getResourceInformation(i);
|
||||||
|
@ -197,7 +197,7 @@ public class Resources {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Resource subtractFrom(Resource lhs, Resource rhs) {
|
public static Resource subtractFrom(Resource lhs, Resource rhs) {
|
||||||
int maxLength = ResourceUtils.getResourceTypesArray().length;
|
int maxLength = ResourceUtils.getNumberOfKnownResourceTypes();
|
||||||
for (int i = 0; i < maxLength; i++) {
|
for (int i = 0; i < maxLength; i++) {
|
||||||
try {
|
try {
|
||||||
ResourceInformation rhsValue = rhs.getResourceInformation(i);
|
ResourceInformation rhsValue = rhs.getResourceInformation(i);
|
||||||
|
@ -243,7 +243,7 @@ public class Resources {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Resource multiplyTo(Resource lhs, double by) {
|
public static Resource multiplyTo(Resource lhs, double by) {
|
||||||
int maxLength = ResourceUtils.getResourceTypesArray().length;
|
int maxLength = ResourceUtils.getNumberOfKnownResourceTypes();
|
||||||
for (int i = 0; i < maxLength; i++) {
|
for (int i = 0; i < maxLength; i++) {
|
||||||
try {
|
try {
|
||||||
ResourceInformation lhsValue = lhs.getResourceInformation(i);
|
ResourceInformation lhsValue = lhs.getResourceInformation(i);
|
||||||
|
@ -266,7 +266,7 @@ public class Resources {
|
||||||
*/
|
*/
|
||||||
public static Resource multiplyAndAddTo(
|
public static Resource multiplyAndAddTo(
|
||||||
Resource lhs, Resource rhs, double by) {
|
Resource lhs, Resource rhs, double by) {
|
||||||
int maxLength = ResourceUtils.getResourceTypesArray().length;
|
int maxLength = ResourceUtils.getNumberOfKnownResourceTypes();
|
||||||
for (int i = 0; i < maxLength; i++) {
|
for (int i = 0; i < maxLength; i++) {
|
||||||
try {
|
try {
|
||||||
ResourceInformation rhsValue = rhs.getResourceInformation(i);
|
ResourceInformation rhsValue = rhs.getResourceInformation(i);
|
||||||
|
@ -299,7 +299,7 @@ public class Resources {
|
||||||
|
|
||||||
public static Resource multiplyAndRoundDown(Resource lhs, double by) {
|
public static Resource multiplyAndRoundDown(Resource lhs, double by) {
|
||||||
Resource out = clone(lhs);
|
Resource out = clone(lhs);
|
||||||
int maxLength = ResourceUtils.getResourceTypesArray().length;
|
int maxLength = ResourceUtils.getNumberOfKnownResourceTypes();
|
||||||
for (int i = 0; i < maxLength; i++) {
|
for (int i = 0; i < maxLength; i++) {
|
||||||
try {
|
try {
|
||||||
ResourceInformation lhsValue = lhs.getResourceInformation(i);
|
ResourceInformation lhsValue = lhs.getResourceInformation(i);
|
||||||
|
@ -408,7 +408,7 @@ public class Resources {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean fitsIn(Resource smaller, Resource bigger) {
|
public static boolean fitsIn(Resource smaller, Resource bigger) {
|
||||||
int maxLength = ResourceUtils.getResourceTypesArray().length;
|
int maxLength = ResourceUtils.getNumberOfKnownResourceTypes();
|
||||||
for (int i = 0; i < maxLength; i++) {
|
for (int i = 0; i < maxLength; i++) {
|
||||||
try {
|
try {
|
||||||
ResourceInformation rhsValue = bigger.getResourceInformation(i);
|
ResourceInformation rhsValue = bigger.getResourceInformation(i);
|
||||||
|
@ -436,7 +436,7 @@ public class Resources {
|
||||||
|
|
||||||
public static Resource componentwiseMin(Resource lhs, Resource rhs) {
|
public static Resource componentwiseMin(Resource lhs, Resource rhs) {
|
||||||
Resource ret = createResource(0);
|
Resource ret = createResource(0);
|
||||||
int maxLength = ResourceUtils.getResourceTypesArray().length;
|
int maxLength = ResourceUtils.getNumberOfKnownResourceTypes();
|
||||||
for (int i = 0; i < maxLength; i++) {
|
for (int i = 0; i < maxLength; i++) {
|
||||||
try {
|
try {
|
||||||
ResourceInformation rhsValue = rhs.getResourceInformation(i);
|
ResourceInformation rhsValue = rhs.getResourceInformation(i);
|
||||||
|
@ -460,7 +460,7 @@ public class Resources {
|
||||||
|
|
||||||
public static Resource componentwiseMax(Resource lhs, Resource rhs) {
|
public static Resource componentwiseMax(Resource lhs, Resource rhs) {
|
||||||
Resource ret = createResource(0);
|
Resource ret = createResource(0);
|
||||||
int maxLength = ResourceUtils.getResourceTypesArray().length;
|
int maxLength = ResourceUtils.getNumberOfKnownResourceTypes();
|
||||||
for (int i = 0; i < maxLength; i++) {
|
for (int i = 0; i < maxLength; i++) {
|
||||||
try {
|
try {
|
||||||
ResourceInformation rhsValue = rhs.getResourceInformation(i);
|
ResourceInformation rhsValue = rhs.getResourceInformation(i);
|
||||||
|
|
Loading…
Reference in New Issue