diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ExecutionType.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ExecutionType.java
index 27cc74d..d45dbbe 100644
--- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ExecutionType.java
+++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ExecutionType.java
@@ -35,6 +35,10 @@
* request (depending on the NM's available resources). Moreover, it may be
* preempted if it blocks a GUARANTEED container from being executed.
*
+ *
+ * The scheduler can also make use of the ExecutionType to specify
+ * whether the containers requested by a {@link ResourceRequest} are allowed to
+ * be executed opportunistically.
*/
@Public
@Evolving
diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ResourceRequest.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ResourceRequest.java
index 790120a..9bb3118 100644
--- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ResourceRequest.java
+++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ResourceRequest.java
@@ -23,6 +23,7 @@
import org.apache.hadoop.classification.InterfaceAudience.Public;
import org.apache.hadoop.classification.InterfaceStability.Evolving;
import org.apache.hadoop.classification.InterfaceStability.Stable;
+import org.apache.hadoop.classification.InterfaceStability.Unstable;
import org.apache.hadoop.yarn.api.ApplicationMasterProtocol;
import org.apache.hadoop.yarn.util.Records;
@@ -79,6 +80,15 @@ public static ResourceRequest newInstance(Priority priority, String hostName,
public static ResourceRequest newInstance(Priority priority, String hostName,
Resource capability, int numContainers, boolean relaxLocality,
String labelExpression) {
+ return newInstance(priority, hostName, capability, numContainers,
+ relaxLocality, labelExpression, ExecutionType.GUARANTEED);
+ }
+
+ @Public
+ @Unstable
+ public static ResourceRequest newInstance(Priority priority, String hostName,
+ Resource capability, int numContainers, boolean relaxLocality, String
+ labelExpression, ExecutionType execType) {
ResourceRequest request = Records.newRecord(ResourceRequest.class);
request.setPriority(priority);
request.setResourceName(hostName);
@@ -86,6 +96,7 @@ public static ResourceRequest newInstance(Priority priority, String hostName,
request.setNumContainers(numContainers);
request.setRelaxLocality(relaxLocality);
request.setNodeLabelExpression(labelExpression);
+ request.setExecutionType(execType);
return request;
}
@@ -278,6 +289,25 @@ public static boolean isAnyLocation(String hostName) {
@Evolving
public abstract void setNodeLabelExpression(String nodelabelExpression);
+ /**
+ * Get the ExecutionType of the requested container.
+ *
+ * @return ExecutionType of this ResourceRequest
+ */
+ @Public
+ @Unstable
+ public abstract ExecutionType getExecutionType();
+
+ /**
+ * Set the ExecutionType of the requested container.
+ *
+ * @param execType
+ * ExecutionType of the requested container
+ */
+ @Public
+ @Unstable
+ public abstract void setExecutionType(ExecutionType execType);
+
@Override
public int hashCode() {
final int prime = 2153;
@@ -322,6 +352,14 @@ public boolean equals(Object obj) {
return false;
} else if (!priority.equals(other.getPriority()))
return false;
+ ExecutionType executionType = getExecutionType();
+ if (executionType == null) {
+ if (other.getExecutionType() != null) {
+ return false;
+ }
+ } else if (executionType != other.getExecutionType()) {
+ return false;
+ }
if (getNodeLabelExpression() == null) {
if (other.getNodeLabelExpression() != null) {
return false;
diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto
index d122f5a..b95a746 100644
--- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto
+++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto
@@ -299,6 +299,7 @@ message ResourceRequestProto {
optional int32 num_containers = 4;
optional bool relax_locality = 5 [default = true];
optional string node_label_expression = 6;
+ optional ExecutionTypeProto executionType = 7 [default = GUARANTEED];
}
enum AMCommandProto {
diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/AMRMClient.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/AMRMClient.java
index e0bf2d3..73c2725 100644
--- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/AMRMClient.java
+++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/AMRMClient.java
@@ -34,6 +34,7 @@
import org.apache.hadoop.yarn.api.records.Container;
import org.apache.hadoop.yarn.api.records.ContainerId;
+import org.apache.hadoop.yarn.api.records.ExecutionType;
import org.apache.hadoop.yarn.api.records.FinalApplicationStatus;
import org.apache.hadoop.yarn.api.records.Priority;
import org.apache.hadoop.yarn.api.records.Resource;
@@ -108,6 +109,7 @@ protected AMRMClient(String name) {
final Priority priority;
final boolean relaxLocality;
final String nodeLabelsExpression;
+ final ExecutionType executionType;
/**
* Instantiates a {@link ContainerRequest} with the given constraints and
@@ -152,6 +154,33 @@ public ContainerRequest(Resource capability, String[] nodes,
String[] racks, Priority priority, boolean relaxLocality) {
this(capability, nodes, racks, priority, relaxLocality, null);
}
+
+ /**
+ * Instantiates a {@link ContainerRequest} with the given constraints.
+ *
+ * @param capability
+ * The {@link Resource} to be requested for each container.
+ * @param nodes
+ * Any hosts to request that the containers are placed on.
+ * @param racks
+ * Any racks to request that the containers are placed on. The
+ * racks corresponding to any hosts requested will be automatically
+ * added to this list.
+ * @param priority
+ * The priority at which to request the containers. Higher
+ * priorities have lower numerical values.
+ * @param relaxLocality
+ * If true, containers for this request may be assigned on hosts
+ * and racks other than the ones explicitly requested.
+ * @param nodeLabelsExpression
+ * Set node labels to allocate resource, now we only support
+ * asking for only a single node label
+ */
+ public ContainerRequest(Resource capability, String[] nodes, String[] racks,
+ Priority priority, boolean relaxLocality, String nodeLabelsExpression) {
+ this(capability, nodes, racks, priority, relaxLocality, null,
+ ExecutionType.GUARANTEED);
+ }
/**
* Instantiates a {@link ContainerRequest} with the given constraints.
@@ -173,10 +202,12 @@ public ContainerRequest(Resource capability, String[] nodes,
* @param nodeLabelsExpression
* Set node labels to allocate resource, now we only support
* asking for only a single node label
+ * @param executionType
+ * Set the execution type of the container request.
*/
- public ContainerRequest(Resource capability, String[] nodes,
- String[] racks, Priority priority, boolean relaxLocality,
- String nodeLabelsExpression) {
+ public ContainerRequest(Resource capability, String[] nodes, String[] racks,
+ Priority priority, boolean relaxLocality, String nodeLabelsExpression,
+ ExecutionType executionType) {
// Validate request
Preconditions.checkArgument(capability != null,
"The Resource to be requested for each container " +
@@ -194,6 +225,7 @@ public ContainerRequest(Resource capability, String[] nodes,
this.priority = priority;
this.relaxLocality = relaxLocality;
this.nodeLabelsExpression = nodeLabelsExpression;
+ this.executionType = executionType;
}
public Resource getCapability() {
@@ -220,10 +252,15 @@ public String getNodeLabelExpression() {
return nodeLabelsExpression;
}
+ public ExecutionType getExecutionType() {
+ return executionType;
+ }
+
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("Capability[").append(capability).append("]");
sb.append("Priority[").append(priority).append("]");
+ sb.append("ExecutionType[").append(executionType).append("]");
return sb.toString();
}
}
diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ResourceRequestPBImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ResourceRequestPBImpl.java
index fc09cef..53ae2cd 100644
--- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ResourceRequestPBImpl.java
+++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ResourceRequestPBImpl.java
@@ -21,6 +21,7 @@
import org.apache.hadoop.classification.InterfaceAudience.Private;
import org.apache.hadoop.classification.InterfaceStability.Unstable;
+import org.apache.hadoop.yarn.api.records.ExecutionType;
import org.apache.hadoop.yarn.api.records.Priority;
import org.apache.hadoop.yarn.api.records.Resource;
import org.apache.hadoop.yarn.api.records.ResourceRequest;
@@ -206,4 +207,24 @@ public void setNodeLabelExpression(String nodeLabelExpression) {
}
builder.setNodeLabelExpression(nodeLabelExpression);
}
+
+ @Override
+ public ExecutionType getExecutionType() {
+ ResourceRequestProtoOrBuilder p = viaProto ? proto : builder;
+ if (!p.hasExecutionType()) {
+ return null;
+ }
+ return ProtoUtils.convertFromProtoFormat(p.getExecutionType());
+ }
+
+ @Override
+ public void setExecutionType(ExecutionType execType) {
+ maybeInitBuilder();
+ if (execType == null) {
+ builder.clearExecutionType();
+ return;
+ }
+ builder.setExecutionType(ProtoUtils.convertToProtoFormat(execType));
+ }
+
}
\ No newline at end of file