/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.hadoop.yarn.api.records; import org.apache.hadoop.classification.InterfaceAudience.Public; import org.apache.hadoop.classification.InterfaceStability.Stable; import org.apache.hadoop.yarn.api.AMRMProtocol; /** * <p><code>ResourceRequest</code> represents the request made by an * application to the <code>ResourceManager</code> to obtain various * <code>Container</code> allocations.</p> * * <p>It includes: * <ul> * <li>{@link Priority} of the request.</li> * <li> * The <em>name</em> of the machine or rack on which the allocation is * desired. A special value of <em>*</em> signifies that * <em>any</em> host/rack is acceptable to the application. * </li> * <li>{@link Resource} required for each request.</li> * <li> * Number of containers of such specifications which are required * by the application. * </li> * </ul> * </p> * * @see Resource * @see AMRMProtocol#allocate(org.apache.hadoop.yarn.api.protocolrecords.AllocateRequest) */ @Public @Stable public abstract class ResourceRequest implements Comparable<ResourceRequest> { /** * Get the <code>Priority</code> of the request. * @return <code>Priority</code> of the request */ @Public @Stable public abstract Priority getPriority(); /** * Set the <code>Priority</code> of the request * @param priority <code>Priority</code> of the request */ @Public @Stable public abstract void setPriority(Priority priority); /** * Get the <em>host/rack</em> on which the allocation is desired. * * A special value of <em>*</em> signifies that <em>any</em> host/rack is * acceptable. * * @return <em>host/rack</em> on which the allocation is desired */ @Public @Stable public abstract String getHostName(); /** * Set <em>host/rack</em> on which the allocation is desired. * * A special value of <em>*</em> signifies that <em>any</em> host/rack is * acceptable. * * @param hostName <em>host/rack</em> on which the allocation is desired */ @Public @Stable public abstract void setHostName(String hostName); /** * Get the <code>Resource</code> capability of the request. * @return <code>Resource</code> capability of the request */ @Public @Stable public abstract Resource getCapability(); /** * Set the <code>Resource</code> capability of the request * @param capability <code>Resource</code> capability of the request */ @Public @Stable public abstract void setCapability(Resource capability); /** * Get the number of containers required with the given specifications. * @return number of containers required with the given specifications */ @Public @Stable public abstract int getNumContainers(); /** * Set the number of containers required with the given specifications * @param numContainers number of containers required with the given * specifications */ @Public @Stable public abstract void setNumContainers(int numContainers); @Override public int hashCode() { final int prime = 31; int result = 1; Resource capability = getCapability(); String hostName = getHostName(); Priority priority = getPriority(); result = prime * result + ((capability == null) ? 0 : capability.hashCode()); result = prime * result + ((hostName == null) ? 0 : hostName.hashCode()); result = prime * result + getNumContainers(); result = prime * result + ((priority == null) ? 0 : priority.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; ResourceRequest other = (ResourceRequest) obj; Resource capability = getCapability(); if (capability == null) { if (other.getCapability() != null) return false; } else if (!capability.equals(other.getCapability())) return false; String hostName = getHostName(); if (hostName == null) { if (other.getHostName() != null) return false; } else if (!hostName.equals(other.getHostName())) return false; if (getNumContainers() != other.getNumContainers()) return false; Priority priority = getPriority(); if (priority == null) { if (other.getPriority() != null) return false; } else if (!priority.equals(other.getPriority())) return false; return true; } @Override public int compareTo(ResourceRequest other) { int priorityComparison = this.getPriority().compareTo(other.getPriority()); if (priorityComparison == 0) { int hostNameComparison = this.getHostName().compareTo(other.getHostName()); if (hostNameComparison == 0) { int capabilityComparison = this.getCapability().compareTo(other.getCapability()); if (capabilityComparison == 0) { int numContainersComparison = this.getNumContainers() - other.getNumContainers(); if (numContainersComparison == 0) { return 0; } else { return numContainersComparison; } } else { return capabilityComparison; } } else { return hostNameComparison; } } else { return priorityComparison; } } }