diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationSubmissionContext.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationSubmissionContext.java index f1ebbfe..7e60f36 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationSubmissionContext.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationSubmissionContext.java @@ -56,8 +56,8 @@ * validityInterval into failure count. If failure count reaches to * maxAppAttempts, the application will be failed. * - *
  • Optional, application-specific {@link LogAggregationContext}
  • - * + *
  • Optional, application-specific {@link LogAggregationContext}
  • + * *

    * * @see ContainerLaunchContext @@ -75,7 +75,7 @@ public static ApplicationSubmissionContext newInstance( boolean isUnmanagedAM, boolean cancelTokensWhenComplete, int maxAppAttempts, Resource resource, String applicationType, boolean keepContainers, String appLabelExpression, - String amContainerLabelExpression) { + String amContainerLabelExpression, ApplicationPriority appPriority) { ApplicationSubmissionContext context = Records.newRecord(ApplicationSubmissionContext.class); context.setApplicationId(applicationId); @@ -90,7 +90,8 @@ public static ApplicationSubmissionContext newInstance( context.setKeepContainersAcrossApplicationAttempts(keepContainers); context.setNodeLabelExpression(appLabelExpression); context.setResource(resource); - + context.setApplicationPriority(appPriority); + ResourceRequest amReq = Records.newRecord(ResourceRequest.class); amReq.setResourceName(ResourceRequest.ANY); amReq.setCapability(resource); @@ -100,7 +101,7 @@ public static ApplicationSubmissionContext newInstance( context.setAMContainerResourceRequest(amReq); return context; } - + public static ApplicationSubmissionContext newInstance( ApplicationId applicationId, String applicationName, String queue, Priority priority, ContainerLaunchContext amContainer, @@ -120,8 +121,8 @@ public static ApplicationSubmissionContext newInstance( boolean isUnmanagedAM, boolean cancelTokensWhenComplete, int maxAppAttempts, Resource resource, String applicationType) { return newInstance(applicationId, applicationName, queue, priority, - amContainer, isUnmanagedAM, cancelTokensWhenComplete, maxAppAttempts, - resource, applicationType, false, null, null); + amContainer, isUnmanagedAM, cancelTokensWhenComplete, maxAppAttempts, + resource, applicationType, false, null, null); } @Public @@ -132,10 +133,10 @@ public static ApplicationSubmissionContext newInstance( boolean isUnmanagedAM, boolean cancelTokensWhenComplete, int maxAppAttempts, Resource resource) { return newInstance(applicationId, applicationName, queue, priority, - amContainer, isUnmanagedAM, cancelTokensWhenComplete, maxAppAttempts, - resource, null); + amContainer, isUnmanagedAM, cancelTokensWhenComplete, maxAppAttempts, + resource, null); } - + @Public @Stable public static ApplicationSubmissionContext newInstance( @@ -190,6 +191,21 @@ public static ApplicationSubmissionContext newInstance( context.setLogAggregationContext(logAggregationContext); return context; } + + @Public + @Stable + public static ApplicationSubmissionContext newInstance( + ApplicationId applicationId, String applicationName, String queue, + Priority priority, ContainerLaunchContext amContainer, + boolean isUnmanagedAM, boolean cancelTokensWhenComplete, + int maxAppAttempts, Resource resource, String applicationType, + boolean keepContainers, String appLabelExpression, + String amContainerLabelExpression) { + return newInstance(applicationId, applicationName, queue, priority, + amContainer, isUnmanagedAM, cancelTokensWhenComplete, maxAppAttempts, + resource, applicationType, keepContainers, null, null, null); + } + /** * Get the ApplicationId of the submitted application. * @return ApplicationId of the submitted application @@ -245,6 +261,7 @@ public static ApplicationSubmissionContext newInstance( */ @Public @Stable + @Deprecated public abstract Priority getPriority(); /** @@ -253,6 +270,7 @@ public static ApplicationSubmissionContext newInstance( */ @Private @Unstable + @Deprecated public abstract void setPriority(Priority priority); /** @@ -532,4 +550,22 @@ public abstract void setLogAggregationContext( @Public @Unstable public abstract void setReservationID(ReservationId reservationID); + + /** + * Get the ApplicationPriority of the application. + * + * @return Priority of the application + */ + @Public + @Unstable + public abstract ApplicationPriority getApplicationPriority(); + + /** + * Set the ApplicationPriority of the application. + * + * @param priority Priority of the application + */ + @Private + @Unstable + public abstract void setApplicationPriority(ApplicationPriority priority); } 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 136192d..493af50 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 @@ -72,6 +72,10 @@ message PriorityProto { optional int32 priority = 1; } +message ApplicationPriorityProto { + optional string app_priority = 1; +} + enum ContainerStateProto { C_NEW = 1; C_RUNNING = 2; @@ -297,6 +301,7 @@ message ApplicationSubmissionContextProto { optional ReservationIdProto reservation_id = 15; optional string node_label_expression = 16; optional ResourceRequestProto am_container_resource_request = 17; + optional ApplicationPriorityProto application_priority = 18; } message LogAggregationContextProto { diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationSubmissionContextPBImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationSubmissionContextPBImpl.java index 303b437..f155091 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationSubmissionContextPBImpl.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationSubmissionContextPBImpl.java @@ -24,6 +24,7 @@ import org.apache.hadoop.classification.InterfaceAudience.Private; import org.apache.hadoop.classification.InterfaceStability.Unstable; import org.apache.hadoop.yarn.api.records.ApplicationId; +import org.apache.hadoop.yarn.api.records.ApplicationPriority; import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext; import org.apache.hadoop.yarn.api.records.ContainerLaunchContext; import org.apache.hadoop.yarn.api.records.LogAggregationContext; @@ -33,6 +34,7 @@ import org.apache.hadoop.yarn.api.records.ResourceRequest; import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationIdProto; +import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationPriorityProto; import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationSubmissionContextProto; import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationSubmissionContextProtoOrBuilder; import org.apache.hadoop.yarn.proto.YarnProtos.ContainerLaunchContextProto; @@ -62,6 +64,7 @@ private ResourceRequest amResourceRequest = null; private LogAggregationContext logAggregationContext = null; private ReservationId reservationId = null; + private ApplicationPriority applicationPriority = null; public ApplicationSubmissionContextPBImpl() { builder = ApplicationSubmissionContextProto.newBuilder(); @@ -130,6 +133,10 @@ private void mergeLocalToBuilder() { if (this.reservationId != null) { builder.setReservationId(convertToProtoFormat(this.reservationId)); } + if (this.applicationPriority != null) { + builder + .setApplicationPriority(convertToProtoFormat(this.applicationPriority)); + } } private void mergeLocalToProto() { @@ -547,4 +554,35 @@ private ReservationIdPBImpl convertFromProtoFormat(ReservationIdProto p) { private ReservationIdProto convertToProtoFormat(ReservationId t) { return ((ReservationIdPBImpl) t).getProto(); } + + @Override + public ApplicationPriority getApplicationPriority() { + ApplicationSubmissionContextProtoOrBuilder p = viaProto ? proto : builder; + if (this.applicationPriority != null) { + return this.applicationPriority; + } + if (!p.hasApplicationPriority()) { + return null; + } + this.applicationPriority = + convertFromProtoFormat(p.getApplicationPriority()); + return this.applicationPriority; + } + + @Override + public void setApplicationPriority(ApplicationPriority priority) { + maybeInitBuilder(); + if (priority == null) + builder.clearPriority(); + this.applicationPriority = priority; + } + + private ApplicationPriorityPBImpl convertFromProtoFormat( + ApplicationPriorityProto p) { + return new ApplicationPriorityPBImpl(p); + } + + private ApplicationPriorityProto convertToProtoFormat(ApplicationPriority t) { + return ((ApplicationPriorityPBImpl) t).getProto(); + } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/TestPBImplRecords.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/TestPBImplRecords.java index b8f6e9c..34e8861 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/TestPBImplRecords.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/TestPBImplRecords.java @@ -189,6 +189,7 @@ public static void setup() throws Exception { generateByNewInstance(ResourceOption.class); generateByNewInstance(LocalResource.class); generateByNewInstance(Priority.class); + generateByNewInstance(ApplicationPriority.class); generateByNewInstance(NodeId.class); generateByNewInstance(NodeReport.class); generateByNewInstance(Token.class); @@ -658,7 +659,7 @@ public void testApplicationSubmissionContextPBImpl() throws Exception { ApplicationSubmissionContext ctx = ApplicationSubmissionContext.newInstance(null, null, null, null, null, - false, false, 0, Resources.none(), null, false, null, null); + false, false, 0, Resources.none(), null, false, null, null, null); Assert.assertNotNull(ctx.getResource()); } @@ -761,6 +762,12 @@ public void testPriorityPBImpl() throws Exception { } @Test + public void testApplicationPriorityPBImpl() throws Exception { + validatePBImplRecord(ApplicationPriorityPBImpl.class, + ApplicationPriorityProto.class); + } + + @Test public void testQueueInfoPBImpl() throws Exception { validatePBImplRecord(QueueInfoPBImpl.class, QueueInfoProto.class); } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationPriority.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationPriority.java new file mode 100644 index 0000000..2a99d83 --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationPriority.java @@ -0,0 +1,59 @@ +/** + * 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.Unstable; +import org.apache.hadoop.yarn.util.Records; + +/** + * The priority assigned to an Application + * + */ +@Public +@Unstable +public abstract class ApplicationPriority { + + @Public + @Unstable + public static ApplicationPriority newInstance(String p) { + ApplicationPriority priority = Records.newRecord(ApplicationPriority.class); + priority.setApplicationPriority(p); + return priority; + } + + /** + * Get the assigned priority + * + * @return the assigned priority + */ + @Public + @Unstable + public abstract String getApplicationPriority(); + + /** + * Set the assigned priority + * + * @param priority the assigned priority + */ + @Public + @Unstable + public abstract void setApplicationPriority(String priority); + +} diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationPriorityPBImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationPriorityPBImpl.java new file mode 100644 index 0000000..3336341 --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationPriorityPBImpl.java @@ -0,0 +1,98 @@ +/** + * 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.impl.pb; + +import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationPriorityProto; +import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationPriorityProtoOrBuilder; + +import org.apache.hadoop.classification.InterfaceAudience.Private; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.api.records.ApplicationPriority; + +import com.google.protobuf.TextFormat; + +@Private +@Unstable +public class ApplicationPriorityPBImpl extends ApplicationPriority { + ApplicationPriorityProto proto = ApplicationPriorityProto + .getDefaultInstance(); + ApplicationPriorityProto.Builder builder = null; + boolean viaProto = false; + + public ApplicationPriorityPBImpl() { + builder = ApplicationPriorityProto.newBuilder(); + } + + public ApplicationPriorityPBImpl(ApplicationPriorityProto proto) { + this.proto = proto; + viaProto = true; + } + + public ApplicationPriorityProto getProto() { + proto = viaProto ? proto : builder.build(); + viaProto = true; + return proto; + } + + private void maybeInitBuilder() { + if (viaProto || builder == null) { + builder = ApplicationPriorityProto.newBuilder(proto); + } + viaProto = false; + } + + @Override + public String getApplicationPriority() { + ApplicationPriorityProtoOrBuilder p = viaProto ? proto : builder; + if (!p.hasAppPriority()) { + return null; + } + return (p.getAppPriority()); + } + + @Override + public void setApplicationPriority(String appPriority) { + maybeInitBuilder(); + if (appPriority == null) { + builder.clearAppPriority(); + return; + } + builder.setAppPriority(appPriority); + } + + @Override + public int hashCode() { + return getProto().hashCode(); + } + + @Override + public boolean equals(Object other) { + if (other == null) + return false; + if (other.getClass().isAssignableFrom(this.getClass())) { + return this.getProto().equals(this.getClass().cast(other).getProto()); + } + return false; + } + + @Override + public String toString() { + return TextFormat.shortDebugString(getProto()); + } +}