YARN-1708. Public YARN APIs for creating/updating/deleting reservations.
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/3f1d205a Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/3f1d205a Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/3f1d205a Branch: refs/heads/YARN-1051 Commit: 3f1d205a73bffac56e295cad989a38aa260af80b Parents: 15478ca Author: subru <su...@outlook.com> Authored: Fri Sep 12 17:16:07 2014 -0700 Committer: carlo curino <Carlo Curino> Committed: Mon Sep 22 16:32:11 2014 -0700 ---------------------------------------------------------------------- YARN-1051-CHANGES.txt | 2 + .../yarn/api/ApplicationClientProtocol.java | 113 ++++++++++ .../ReservationDeleteRequest.java | 72 ++++++ .../ReservationDeleteResponse.java | 48 ++++ .../ReservationSubmissionRequest.java | 97 ++++++++ .../ReservationSubmissionResponse.java | 78 +++++++ .../ReservationUpdateRequest.java | 96 ++++++++ .../ReservationUpdateResponse.java | 48 ++++ .../records/ApplicationSubmissionContext.java | 25 ++- .../yarn/api/records/ReservationDefinition.java | 137 ++++++++++++ .../hadoop/yarn/api/records/ReservationId.java | 147 ++++++++++++ .../yarn/api/records/ReservationRequest.java | 222 +++++++++++++++++++ .../records/ReservationRequestInterpreter.java | 101 +++++++++ .../yarn/api/records/ReservationRequests.java | 94 ++++++++ .../main/proto/applicationclient_protocol.proto | 3 + .../src/main/proto/yarn_protos.proto | 36 +++ .../src/main/proto/yarn_service_protos.proto | 28 +++ .../ApplicationClientProtocolPBClientImpl.java | 58 ++++- .../ApplicationClientProtocolPBServiceImpl.java | 61 +++++ .../impl/pb/ReservationDeleteRequestPBImpl.java | 127 +++++++++++ .../pb/ReservationDeleteResponsePBImpl.java | 68 ++++++ .../pb/ReservationSubmissionRequestPBImpl.java | 152 +++++++++++++ .../pb/ReservationSubmissionResponsePBImpl.java | 129 +++++++++++ .../impl/pb/ReservationUpdateRequestPBImpl.java | 169 ++++++++++++++ .../pb/ReservationUpdateResponsePBImpl.java | 68 ++++++ .../pb/ApplicationSubmissionContextPBImpl.java | 38 ++++ .../yarn/api/records/impl/pb/ProtoUtils.java | 17 ++ .../impl/pb/ReservationDefinitionPBImpl.java | 169 ++++++++++++++ .../records/impl/pb/ReservationIdPBImpl.java | 75 +++++++ .../impl/pb/ReservationRequestPBImpl.java | 152 +++++++++++++ .../impl/pb/ReservationRequestsPBImpl.java | 189 ++++++++++++++++ .../org/apache/hadoop/yarn/util/UTCClock.java | 39 ++++ 32 files changed, 2856 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/3f1d205a/YARN-1051-CHANGES.txt ---------------------------------------------------------------------- diff --git a/YARN-1051-CHANGES.txt b/YARN-1051-CHANGES.txt index 9fd4b3b..a7c08a0 100644 --- a/YARN-1051-CHANGES.txt +++ b/YARN-1051-CHANGES.txt @@ -3,3 +3,5 @@ CapacityScheduler. (Carlo Curino and Subru Krishnan via curino) YARN-2475. Logic for responding to capacity drops for the ReservationSystem. (Carlo Curino and Subru Krishnan via curino) + +YARN-1708. Public YARN APIs for creating/updating/deleting reservations. (subru) http://git-wip-us.apache.org/repos/asf/hadoop/blob/3f1d205a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationClientProtocol.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationClientProtocol.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationClientProtocol.java index e449c1e..863a068 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationClientProtocol.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationClientProtocol.java @@ -57,6 +57,12 @@ import org.apache.hadoop.yarn.api.protocolrecords.MoveApplicationAcrossQueuesReq import org.apache.hadoop.yarn.api.protocolrecords.MoveApplicationAcrossQueuesResponse; import org.apache.hadoop.yarn.api.protocolrecords.RenewDelegationTokenRequest; import org.apache.hadoop.yarn.api.protocolrecords.RenewDelegationTokenResponse; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteRequest; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteResponse; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionRequest; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionResponse; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateRequest; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateResponse; import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationRequest; import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationResponse; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; @@ -67,6 +73,7 @@ import org.apache.hadoop.yarn.api.records.ContainerId; import org.apache.hadoop.yarn.api.records.ContainerLaunchContext; import org.apache.hadoop.yarn.api.records.ContainerReport; import org.apache.hadoop.yarn.api.records.NodeReport; +import org.apache.hadoop.yarn.api.records.ReservationId; import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.api.records.ResourceRequest; import org.apache.hadoop.yarn.api.records.Token; @@ -543,4 +550,110 @@ public interface ApplicationClientProtocol { public GetContainersResponse getContainers(GetContainersRequest request) throws YarnException, IOException; + /** + * <p> + * The interface used by clients to submit a new reservation to the + * {@link ResourceManager}. + * </p> + * + * <p> + * The client packages all details of its request in a + * {@link ReservationSubmissionRequest} object. This contains information + * about the amount of capacity, temporal constraints, and concurrency needs. + * Furthermore, the reservation might be composed of multiple stages, with + * ordering dependencies among them. + * </p> + * + * <p> + * In order to respond, a new admission control component in the + * {@link ResourceManager} performs an analysis of the resources that have + * been committed over the period of time the user is requesting, verify that + * the user requests can be fulfilled, and that it respect a sharing policy + * (e.g., {@link CapacityOverTimePolicy}). Once it has positively determined + * that the ReservationSubmissionRequest is satisfiable the + * {@link ResourceManager} answers with a + * {@link ReservationSubmissionResponse} that include a non-null + * {@link ReservationId}. Upon failure to find a valid allocation the response + * is an exception with the reason. + * + * On application submission the client can use this {@link ReservationId} to + * obtain access to the reserved resources. + * </p> + * + * <p> + * The system guarantees that during the time-range specified by the user, the + * reservationID will be corresponding to a valid reservation. The amount of + * capacity dedicated to such queue can vary overtime, depending of the + * allocation that has been determined. But it is guaranteed to satisfy all + * the constraint expressed by the user in the + * {@link ReservationSubmissionRequest}. + * </p> + * + * @param request the request to submit a new Reservation + * @return response the {@link ReservationId} on accepting the submission + * @throws YarnException if the request is invalid or reservation cannot be + * created successfully + * @throws IOException + * + */ + @Public + @Unstable + public ReservationSubmissionResponse submitReservation( + ReservationSubmissionRequest request) throws YarnException, IOException; + + /** + * <p> + * The interface used by clients to update an existing Reservation. This is + * referred to as a re-negotiation process, in which a user that has + * previously submitted a Reservation. + * </p> + * + * <p> + * The allocation is attempted by virtually substituting all previous + * allocations related to this Reservation with new ones, that satisfy the new + * {@link ReservationUpdateRequest}. Upon success the previous allocation is + * substituted by the new one, and on failure (i.e., if the system cannot find + * a valid allocation for the updated request), the previous allocation + * remains valid. + * + * The {@link ReservationId} is not changed, and applications currently + * running within this reservation will automatically receive the resources + * based on the new allocation. + * </p> + * + * @param request to update an existing Reservation (the ReservationRequest + * should refer to an existing valid {@link ReservationId}) + * @return response empty on successfully updating the existing reservation + * @throws YarnException if the request is invalid or reservation cannot be + * updated successfully + * @throws IOException + * + */ + @Public + @Unstable + public ReservationUpdateResponse updateReservation( + ReservationUpdateRequest request) throws YarnException, IOException; + + /** + * <p> + * The interface used by clients to remove an existing Reservation. + * + * Upon deletion of a reservation applications running with this reservation, + * are automatically downgraded to normal jobs running without any dedicated + * reservation. + * </p> + * + * @param request to remove an existing Reservation (the ReservationRequest + * should refer to an existing valid {@link ReservationId}) + * @return response empty on successfully deleting the existing reservation + * @throws YarnException if the request is invalid or reservation cannot be + * deleted successfully + * @throws IOException + * + */ + @Public + @Unstable + public ReservationDeleteResponse deleteReservation( + ReservationDeleteRequest request) throws YarnException, IOException; + } http://git-wip-us.apache.org/repos/asf/hadoop/blob/3f1d205a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationDeleteRequest.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationDeleteRequest.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationDeleteRequest.java new file mode 100644 index 0000000..1dd876b --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationDeleteRequest.java @@ -0,0 +1,72 @@ +/** + * 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.protocolrecords; + +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.api.records.ReservationDefinition; +import org.apache.hadoop.yarn.api.records.ReservationId; +import org.apache.hadoop.yarn.util.Records; + +/** + * {@link ReservationDeleteRequest} captures the set of requirements the user + * has to delete an existing reservation. + * + * @see ReservationDefinition + * + */ +@Public +@Unstable +public abstract class ReservationDeleteRequest { + + @Public + @Unstable + public static ReservationDeleteRequest newInstance(ReservationId reservationId) { + ReservationDeleteRequest request = + Records.newRecord(ReservationDeleteRequest.class); + request.setReservationId(reservationId); + return request; + } + + /** + * Get the {@link ReservationId}, that corresponds to a valid resource + * allocation in the scheduler (between start and end time of this + * reservation) + * + * @return the {@link ReservationId} representing the unique id of the + * corresponding reserved resource allocation in the scheduler + */ + @Public + @Unstable + public abstract ReservationId getReservationId(); + + /** + * Set the {@link ReservationId}, that correspond to a valid resource + * allocation in the scheduler (between start and end time of this + * reservation) + * + * @param reservationId the {@link ReservationId} representing the the unique + * id of the corresponding reserved resource allocation in the + * scheduler + */ + @Public + @Unstable + public abstract void setReservationId(ReservationId reservationId); + +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/3f1d205a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationDeleteResponse.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationDeleteResponse.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationDeleteResponse.java new file mode 100644 index 0000000..eedd3a4 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationDeleteResponse.java @@ -0,0 +1,48 @@ +/** + * 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.protocolrecords; + +import org.apache.hadoop.classification.InterfaceAudience.Private; +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.api.records.ReservationDefinition; +import org.apache.hadoop.yarn.util.Records; + +/** + * {@link ReservationDeleteResponse} contains the answer of the admission + * control system in the {@link ResourceManager} to a reservation delete + * operation. Currently response is empty if the operation was successful, if + * not an exception reporting reason for a failure. + * + * @see ReservationDefinition + * + */ +@Public +@Unstable +public abstract class ReservationDeleteResponse { + + @Private + @Unstable + public static ReservationDeleteResponse newInstance() { + ReservationDeleteResponse response = + Records.newRecord(ReservationDeleteResponse.class); + return response; + } + +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/3f1d205a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationSubmissionRequest.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationSubmissionRequest.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationSubmissionRequest.java new file mode 100644 index 0000000..e550fe2 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationSubmissionRequest.java @@ -0,0 +1,97 @@ +/** + * 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.protocolrecords; + +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.api.records.QueueInfo; +import org.apache.hadoop.yarn.api.records.ReservationDefinition; +import org.apache.hadoop.yarn.util.Records; + +/** + * {@link ReservationSubmissionRequest} captures the set of requirements the + * user has to create a reservation. + * + * @see ReservationDefinition + * + */ +@Public +@Unstable +public abstract class ReservationSubmissionRequest { + + @Public + @Unstable + public static ReservationSubmissionRequest newInstance( + ReservationDefinition reservationDefinition, String queueName) { + ReservationSubmissionRequest request = + Records.newRecord(ReservationSubmissionRequest.class); + request.setReservationDefinition(reservationDefinition); + request.setQueue(queueName); + return request; + } + + /** + * Get the {@link ReservationDefinition} representing the user constraints for + * this reservation + * + * @return the reservation definition representing user constraints + */ + @Public + @Unstable + public abstract ReservationDefinition getReservationDefinition(); + + /** + * Set the {@link ReservationDefinition} representing the user constraints for + * this reservation + * + * @param reservationDefinition the reservation request representing the + * reservation + */ + @Public + @Unstable + public abstract void setReservationDefinition( + ReservationDefinition reservationDefinition); + + /** + * Get the name of the {@link Plan} that corresponds to the name of the + * {@link QueueInfo} in the scheduler to which the reservation will be + * submitted to. + * + * @return the name of the {@link Plan} that corresponds to the name of the + * {@link QueueInfo} in the scheduler to which the reservation will be + * submitted to + */ + @Public + @Unstable + public abstract String getQueue(); + + /** + * Set the name of the {@link Plan} that corresponds to the name of the + * {@link QueueInfo} in the scheduler to which the reservation will be + * submitted to + * + * @param the name of the parent {@link Plan} that corresponds to the name of + * the {@link QueueInfo} in the scheduler to which the reservation + * will be submitted to + */ + @Public + @Unstable + public abstract void setQueue(String queueName); + +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/3f1d205a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationSubmissionResponse.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationSubmissionResponse.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationSubmissionResponse.java new file mode 100644 index 0000000..b57ef52 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationSubmissionResponse.java @@ -0,0 +1,78 @@ +/** + * 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.protocolrecords; + +import org.apache.hadoop.classification.InterfaceAudience.Private; +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.api.records.ReservationDefinition; +import org.apache.hadoop.yarn.api.records.ReservationId; +import org.apache.hadoop.yarn.util.Records; + +import com.sun.naming.internal.ResourceManager; + +/** + * {@link ReservationSubmissionResponse} contains the answer of the admission + * control system in the {@link ResourceManager} to a reservation create + * operation. Response contains a {@link ReservationId} if the operation was + * successful, if not an exception reporting reason for a failure. + * + * @see ReservationDefinition + * + */ +@Public +@Unstable +public abstract class ReservationSubmissionResponse { + + @Private + @Unstable + public static ReservationSubmissionResponse newInstance( + ReservationId reservationId) { + ReservationSubmissionResponse response = + Records.newRecord(ReservationSubmissionResponse.class); + response.setReservationId(reservationId); + return response; + } + + /** + * Get the {@link ReservationId}, that corresponds to a valid resource + * allocation in the scheduler (between start and end time of this + * reservation) + * + * @return the {@link ReservationId} representing the unique id of the + * corresponding reserved resource allocation in the scheduler + */ + @Public + @Unstable + public abstract ReservationId getReservationId(); + + /** + * Set the {@link ReservationId}, that correspond to a valid resource + * allocation in the scheduler (between start and end time of this + * reservation) + * + * @param reservationId the {@link ReservationId} representing the the unique + * id of the corresponding reserved resource allocation in the + * scheduler + */ + @Private + @Unstable + public abstract void setReservationId(ReservationId reservationId); + +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/3f1d205a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationUpdateRequest.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationUpdateRequest.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationUpdateRequest.java new file mode 100644 index 0000000..b5a4b7b --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationUpdateRequest.java @@ -0,0 +1,96 @@ +/** + * 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.protocolrecords; + +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.api.records.ReservationDefinition; +import org.apache.hadoop.yarn.api.records.ReservationId; +import org.apache.hadoop.yarn.util.Records; + +/** + * {@link ReservationUpdateRequest} captures the set of requirements the user + * has to update an existing reservation. + * + * @see ReservationDefinition + * + */ +@Public +@Unstable +public abstract class ReservationUpdateRequest { + + @Public + @Unstable + public static ReservationUpdateRequest newInstance( + ReservationDefinition reservationDefinition, ReservationId reservationId) { + ReservationUpdateRequest request = + Records.newRecord(ReservationUpdateRequest.class); + request.setReservationDefinition(reservationDefinition); + request.setReservationId(reservationId); + return request; + } + + /** + * Get the {@link ReservationDefinition} representing the updated user + * constraints for this reservation + * + * @return the reservation definition representing user constraints + */ + @Public + @Unstable + public abstract ReservationDefinition getReservationDefinition(); + + /** + * Set the {@link ReservationDefinition} representing the updated user + * constraints for this reservation + * + * @param reservationDefinition the reservation request representing the + * reservation + */ + @Public + @Unstable + public abstract void setReservationDefinition( + ReservationDefinition reservationDefinition); + + /** + * Get the {@link ReservationId}, that corresponds to a valid resource + * allocation in the scheduler (between start and end time of this + * reservation) + * + * @return the {@link ReservationId} representing the unique id of the + * corresponding reserved resource allocation in the scheduler + */ + @Public + @Unstable + public abstract ReservationId getReservationId(); + + /** + * Set the {@link ReservationId}, that correspond to a valid resource + * allocation in the scheduler (between start and end time of this + * reservation) + * + * @param reservationId the {@link ReservationId} representing the the unique + * id of the corresponding reserved resource allocation in the + * scheduler + */ + @Public + @Unstable + public abstract void setReservationId(ReservationId reservationId); + +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/3f1d205a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationUpdateResponse.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationUpdateResponse.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationUpdateResponse.java new file mode 100644 index 0000000..bfd2d51 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/ReservationUpdateResponse.java @@ -0,0 +1,48 @@ +/** + * 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.protocolrecords; + +import org.apache.hadoop.classification.InterfaceAudience.Private; +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.api.records.ReservationDefinition; +import org.apache.hadoop.yarn.util.Records; + +/** + * {@link ReservationUpdateResponse} contains the answer of the admission + * control system in the {@link ResourceManager} to a reservation update + * operation. Currently response is empty if the operation was successful, if + * not an exception reporting reason for a failure. + * + * @see ReservationDefinition + * + */ +@Public +@Unstable +public abstract class ReservationUpdateResponse { + + @Private + @Unstable + public static ReservationUpdateResponse newInstance() { + ReservationUpdateResponse response = + Records.newRecord(ReservationUpdateResponse.class); + return response; + } + +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/3f1d205a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationSubmissionContext.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationSubmissionContext.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationSubmissionContext.java index 723a2e0..bb2fbfc 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationSubmissionContext.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationSubmissionContext.java @@ -381,4 +381,27 @@ public abstract class ApplicationSubmissionContext { @Stable public abstract void setAttemptFailuresValidityInterval( long attemptFailuresValidityInterval); -} \ No newline at end of file + + /** + * Get the reservation id, that corresponds to a valid resource allocation in + * the scheduler (between start and end time of the corresponding reservation) + * + * @return the reservation id representing the unique id of the corresponding + * reserved resource allocation in the scheduler + */ + @Public + @Unstable + public abstract ReservationId getReservationID(); + + /** + * Set the reservation id, that correspond to a valid resource allocation in + * the scheduler (between start and end time of the corresponding reservation) + * + * @param reservationId representing the unique id of the + * corresponding reserved resource allocation in the scheduler + */ + @Public + @Unstable + public abstract void setReservationID(ReservationId reservationID); + +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/3f1d205a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationDefinition.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationDefinition.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationDefinition.java new file mode 100644 index 0000000..c94463d --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationDefinition.java @@ -0,0 +1,137 @@ +/** + * 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.Evolving; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.util.Records; + +/** + * {@link ReservationDefinition} captures the set of resource and time + * constraints the user cares about regarding a reservation. + * + * @see ResourceRequest + * + */ +@Public +@Unstable +public abstract class ReservationDefinition { + + @Public + @Unstable + public static ReservationDefinition newInstance(long arrival, long deadline, + ReservationRequests reservationRequests, String name) { + ReservationDefinition rDefinition = + Records.newRecord(ReservationDefinition.class); + rDefinition.setArrival(arrival); + rDefinition.setDeadline(deadline); + rDefinition.setReservationRequests(reservationRequests); + rDefinition.setReservationName(name); + return rDefinition; + } + + /** + * Get the arrival time or the earliest time from which the resource(s) can be + * allocated. Time expressed as UTC. + * + * @return the earliest valid time for this reservation + */ + @Public + @Unstable + public abstract long getArrival(); + + /** + * Set the arrival time or the earliest time from which the resource(s) can be + * allocated. Time expressed as UTC. + * + * @param earliestStartTime the earliest valid time for this reservation + */ + @Public + @Unstable + public abstract void setArrival(long earliestStartTime); + + /** + * Get the deadline or the latest time by when the resource(s) must be + * allocated. Time expressed as UTC. + * + * @return the deadline or the latest time by when the resource(s) must be + * allocated + */ + @Public + @Unstable + public abstract long getDeadline(); + + /** + * Set the deadline or the latest time by when the resource(s) must be + * allocated. Time expressed as UTC. + * + * @param latestEndTime the deadline or the latest time by when the + * resource(s) should be allocated + */ + @Public + @Unstable + public abstract void setDeadline(long latestEndTime); + + /** + * Get the list of {@link ReservationRequests} representing the resources + * required by the application + * + * @return the list of {@link ReservationRequests} + */ + @Public + @Unstable + public abstract ReservationRequests getReservationRequests(); + + /** + * Set the list of {@link ReservationRequests} representing the resources + * required by the application + * + * @param resources the list of {@link ReservationRequests} + */ + @Public + @Unstable + public abstract void setReservationRequests( + ReservationRequests reservationRequests); + + /** + * Get the name for this reservation. The name need-not be unique, and it is + * just a mnemonic for the user (akin to job names). Accepted reservations are + * uniquely identified by a system-generated ReservationId. + * + * @return string representing the name of the corresponding reserved resource + * allocation in the scheduler + */ + @Public + @Evolving + public abstract String getReservationName(); + + /** + * Set the name for this reservation. The name need-not be unique, and it is + * just a mnemonic for the user (akin to job names). Accepted reservations are + * uniquely identified by a system-generated ReservationId. + * + * @param name representing the name of the corresponding reserved resource + * allocation in the scheduler + */ + @Public + @Evolving + public abstract void setReservationName(String name); + +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/3f1d205a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationId.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationId.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationId.java new file mode 100644 index 0000000..47a8c40 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationId.java @@ -0,0 +1,147 @@ +/** + * 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 java.text.NumberFormat; + +import org.apache.hadoop.classification.InterfaceAudience.Private; +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.util.Records; + +/** + * <p> + * {@link ReservationId} represents the <em>globally unique</em> identifier for + * a reservation. + * </p> + * + * <p> + * The globally unique nature of the identifier is achieved by using the + * <em>cluster timestamp</em> i.e. start-time of the {@link ResourceManager} + * along with a monotonically increasing counter for the reservation. + * </p> + */ +@Public +@Unstable +public abstract class ReservationId implements Comparable<ReservationId> { + + @Private + @Unstable + public static final String reserveIdStrPrefix = "reservation_"; + protected long clusterTimestamp; + protected long id; + + @Private + @Unstable + public static ReservationId newInstance(long clusterTimestamp, long id) { + ReservationId reservationId = Records.newRecord(ReservationId.class); + reservationId.setClusterTimestamp(clusterTimestamp); + reservationId.setId(id); + reservationId.build(); + return reservationId; + } + + /** + * Get the long identifier of the {@link ReservationId} which is unique for + * all Reservations started by a particular instance of the + * {@link ResourceManager}. + * + * @return long identifier of the {@link ReservationId} + */ + @Public + @Unstable + public abstract long getId(); + + @Private + @Unstable + protected abstract void setId(long id); + + /** + * Get the <em>start time</em> of the {@link ResourceManager} which is used to + * generate globally unique {@link ReservationId}. + * + * @return <em>start time</em> of the {@link ResourceManager} + */ + @Public + @Unstable + public abstract long getClusterTimestamp(); + + @Private + @Unstable + protected abstract void setClusterTimestamp(long clusterTimestamp); + + protected abstract void build(); + + static final ThreadLocal<NumberFormat> reservIdFormat = + new ThreadLocal<NumberFormat>() { + @Override + public NumberFormat initialValue() { + NumberFormat fmt = NumberFormat.getInstance(); + fmt.setGroupingUsed(false); + fmt.setMinimumIntegerDigits(4); + return fmt; + } + }; + + @Override + public int compareTo(ReservationId other) { + if (this.getClusterTimestamp() - other.getClusterTimestamp() == 0) { + return getId() > getId() ? 1 : getId() < getId() ? -1 : 0; + } else { + return this.getClusterTimestamp() > other.getClusterTimestamp() ? 1 + : this.getClusterTimestamp() < other.getClusterTimestamp() ? -1 : 0; + } + } + + @Override + public String toString() { + return reserveIdStrPrefix + this.getClusterTimestamp() + "_" + + reservIdFormat.get().format(getId()); + } + + @Override + public int hashCode() { + // generated by eclipse + final int prime = 31; + int result = 1; + result = + prime * result + + (int) (getClusterTimestamp() ^ (getClusterTimestamp() >>> 32)); + result = prime * result + (int) (getId() ^ (getId() >>> 32)); + return result; + } + + @Override + public boolean equals(Object obj) { + // generated by eclipse + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ReservationId other = (ReservationId) obj; + if (getClusterTimestamp() != other.getClusterTimestamp()) + return false; + if (getId() != other.getId()) + return false; + return true; + } + +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/3f1d205a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequest.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequest.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequest.java new file mode 100644 index 0000000..ded6d06 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequest.java @@ -0,0 +1,222 @@ +/** + * 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 java.io.Serializable; + +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.util.Records; + +/** + * <p> + * {@link ReservationRequest} represents the request made by an application to + * the {@link ResourceManager} to reserve {@link Resource}s. + * </p> + * + * <p> + * It includes: + * <ul> + * <li>{@link Resource} required for each request.</li> + * <li> + * Number of containers, of above specifications, which are required by the + * application.</li> + * <li> + * Concurrency that indicates the gang size of the request.</li> + * </ul> + * </p> + * + */ +@Public +@Unstable +public abstract class ReservationRequest implements + Comparable<ReservationRequest> { + + @Public + @Unstable + public static ReservationRequest newInstance(Resource capability, + int numContainers) { + return newInstance(capability, numContainers, 1, -1); + } + + @Public + @Unstable + public static ReservationRequest newInstance(Resource capability, + int numContainers, int concurrency, long duration) { + ReservationRequest request = Records.newRecord(ReservationRequest.class); + request.setCapability(capability); + request.setNumContainers(numContainers); + request.setConcurrency(concurrency); + request.setDuration(duration); + return request; + } + + @Public + @Unstable + public static class ReservationRequestComparator implements + java.util.Comparator<ReservationRequest>, Serializable { + + private static final long serialVersionUID = 1L; + + @Override + public int compare(ReservationRequest r1, ReservationRequest r2) { + // Compare numContainers, concurrency and capability + int ret = r1.getNumContainers() - r2.getNumContainers(); + if (ret == 0) { + ret = r1.getConcurrency() - r2.getConcurrency(); + } + if (ret == 0) { + ret = r1.getCapability().compareTo(r2.getCapability()); + } + return ret; + } + } + + /** + * Get the {@link Resource} capability of the request. + * + * @return {@link Resource} capability of the request + */ + @Public + @Unstable + public abstract Resource getCapability(); + + /** + * Set the {@link Resource} capability of the request + * + * @param capability {@link Resource} capability of the request + */ + @Public + @Unstable + 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 + @Unstable + 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 + @Unstable + public abstract void setNumContainers(int numContainers); + + /** + * Get the number of containers that need to be scheduled concurrently. The + * default value of 1 would fall back to the current non concurrency + * constraints on the scheduling behavior. + * + * @return the number of containers to be concurrently scheduled + */ + @Public + @Unstable + public abstract int getConcurrency(); + + /** + * Set the number of containers that need to be scheduled concurrently. The + * default value of 1 would fall back to the current non concurrency + * constraints on the scheduling behavior. + * + * @param numContainers the number of containers to be concurrently scheduled + */ + @Public + @Unstable + public abstract void setConcurrency(int numContainers); + + /** + * Get the duration in milliseconds for which the resource is required. A + * default value of -1, indicates an unspecified lease duration, and fallback + * to current behavior. + * + * @return the duration in milliseconds for which the resource is required + */ + @Public + @Unstable + public abstract long getDuration(); + + /** + * Set the duration in milliseconds for which the resource is required. + * + * @param duration the duration in milliseconds for which the resource is + * required + */ + @Public + @Unstable + public abstract void setDuration(long duration); + + @Override + public int hashCode() { + final int prime = 2153; + int result = 2459; + Resource capability = getCapability(); + result = + prime * result + ((capability == null) ? 0 : capability.hashCode()); + result = prime * result + getNumContainers(); + result = prime * result + getConcurrency(); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ReservationRequest other = (ReservationRequest) obj; + Resource capability = getCapability(); + if (capability == null) { + if (other.getCapability() != null) + return false; + } else if (!capability.equals(other.getCapability())) + return false; + if (getNumContainers() != other.getNumContainers()) + return false; + if (getConcurrency() != other.getConcurrency()) + return false; + return true; + } + + @Override + public int compareTo(ReservationRequest other) { + int numContainersComparison = + this.getNumContainers() - other.getNumContainers(); + if (numContainersComparison == 0) { + int concurrencyComparison = + this.getConcurrency() - other.getConcurrency(); + if (concurrencyComparison == 0) { + return this.getCapability().compareTo(other.getCapability()); + } else { + return concurrencyComparison; + } + } else { + return numContainersComparison; + } + } + +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/3f1d205a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequestInterpreter.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequestInterpreter.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequestInterpreter.java new file mode 100644 index 0000000..4621e0d --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequestInterpreter.java @@ -0,0 +1,101 @@ +package org.apache.hadoop.yarn.api.records; + +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Evolving; + +/** + * Enumeration of various types of dependencies among multiple + * {@link ReservationRequests} within one {@link ReservationDefinition} (from + * least constraining to most constraining). + */ +@Public +@Evolving +public enum ReservationRequestInterpreter { + /** + * Requires that exactly ONE among the {@link ReservationRequest} submitted as + * of a {@link ReservationDefinition} is satisfied to satisfy the overall + * {@link ReservationDefinition}. + * + * WHEN TO USE THIS: This is useful when the user have multiple equivalent + * ways to run an application, and wants to expose to the ReservationAgent + * such flexibility. For example an application could use one <32GB,16core> + * container for 10min, or 16 <2GB,1core> containers for 15min, the + * ReservationAgent will decide which one of the two it is best for the system + * to place. + * + */ + R_ANY, + + /** + * Requires that ALL of the {@link ReservationRequest} submitted as part of a + * {@link ReservationDefinition} are satisfied for the overall + * {@link ReservationDefinition} to be satisfied. No constraints are imposed + * on the temporal ordering of the allocation used to satisfy the + * ResourceRequeusts. + * + * WHEN TO USE THIS: This is useful to capture a scenario in which the user + * cares for multiple ReservationDefinition to be all accepted, or none. For + * example, a user might want a reservation R1: with 10 x <8GB,4core> for + * 10min, and a reservation R2: with 2 <1GB,1core> for 1h, and only if both + * are satisfied the workflow run in this reservation succeeds. The key + * differentiator from ALL and ORDER, ORDER_NO_GAP, is that ALL imposes no + * restrictions on the relative allocations used to place R1 and R2 above. + * + */ + R_ALL, + + /** + * Requires that ALL of the {@link ReservationRequest} submitted as part of a + * {@link ReservationDefinition} are satisfied for the overall + * {@link ReservationDefinition} to be satisfied. Moreover, it imposes a + * strict temporal ordering on the allocation used to satisfy the + * {@link ReservationRequest}s. The allocations satisfying the + * {@link ReservationRequest} in position k must strictly precede the + * allocations for the {@link ReservationRequest} at position k+1. No + * constraints are imposed on temporal gaps between subsequent allocations + * (the last instant of the previous allocation can be an arbitrary long + * period of time before the first instant of the subsequent allocation). + * + * WHEN TO USE THIS: Like ALL this requires all ReservationDefinitions to be + * placed, but it also imposes a time ordering on the allocations used. This + * is important if the ReservationDefinition(s) are used to describe a + * workflow with inherent inter-stage dependencies. For example, a first job + * runs in a ReservaitonDefinition R1 (10 x <1GB,1core> for 20min), and its + * output is consumed by a second job described by a ReservationDefinition R2 + * (5 x <1GB,1core>) for 50min). R2 allocation cannot overlap R1, as R2 models + * a job depending on the output of the job modeled by R1. + */ + R_ORDER, + + /** + * Requires that ALL of the {@link ReservationRequest} submitted as part of a + * {@link ReservationDefinition} are satisfied for the overall + * {@link ReservationDefinition} to be satisfied. Moreover, it imposes a + * strict temporal ordering on the allocation used to satisfy the + * {@link ResourceRequeust}s. It imposes a strict temporal ordering on the + * allocation used to satisfy the {@link ReservationRequest}s. The allocations + * satisfying the {@link ReservationRequest} in position k must strictly + * precede the allocations for the {@link ReservationRequest} at position k+1. + * Moreover it imposes a "zero-size gap" between subsequent allocations, i.e., + * the last instant in time of the allocations associated with the + * {@link ReservationRequest} at position k must be exactly preceding the + * first instant in time of the {@link ReservationRequest} at position k+1. + * Time ranges are interpreted as [a,b) inclusive left, exclusive right. + * + * WHEN TO USE THIS: This is a stricter version of R_ORDER, which allows no + * gaps between the allocations that satisfy R1 and R2. The use of this is + * twofold: 1) prevent long gaps between subsequent stages that produce very + * large intermediate output (e.g., the output of R1 is too large to be kept + * around for long before the job running in R2 consumes it, and disposes of + * it), 2) if the job being modeled has a time-varying resource need, one can + * combine multiple ResourceDefinition each approximating a portion of the job + * execution (think of using multiple rectangular bounding boxes to described + * an arbitrarily shaped area). By asking for no-gaps we guarantee + * "continuity" of resources given to this job. This still allow for some + * flexibility, as the entire "train" of allocations can be moved rigidly back + * or forth within the start-deadline time range (if there is slack). + * + */ + R_ORDER_NO_GAP + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/3f1d205a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequests.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequests.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequests.java new file mode 100644 index 0000000..8cc3fbc --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ReservationRequests.java @@ -0,0 +1,94 @@ +/** + * 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 java.util.List; + +import org.apache.hadoop.classification.InterfaceAudience.Public; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.yarn.util.Records; + +/** + * {@link ReservationRequests} captures the set of resource and constraints the + * user cares about regarding a reservation. + * + * @see ReservationRequest + * + */ +@Public +@Unstable +public abstract class ReservationRequests { + + @Public + @Unstable + public static ReservationRequests newInstance( + List<ReservationRequest> reservationResources, + ReservationRequestInterpreter type) { + ReservationRequests reservationRequests = + Records.newRecord(ReservationRequests.class); + reservationRequests.setReservationResources(reservationResources); + reservationRequests.setInterpreter(type); + return reservationRequests; + } + + /** + * Get the list of {@link ReservationRequest} representing the resources + * required by the application + * + * @return the list of {@link ReservationRequest} + */ + @Public + @Unstable + public abstract List<ReservationRequest> getReservationResources(); + + /** + * Set the list of {@link ReservationRequest} representing the resources + * required by the application + * + * @param resources the list of {@link ReservationRequest} + */ + @Public + @Unstable + public abstract void setReservationResources( + List<ReservationRequest> reservationResources); + + /** + * Get the {@link ReservationRequestInterpreter}, representing how the list of + * resources should be allocated, this captures temporal ordering and other + * constraints. + * + * @return the list of {@link ReservationRequestInterpreter} + */ + @Public + @Unstable + public abstract ReservationRequestInterpreter getInterpreter(); + + /** + * Set the {@link ReservationRequestInterpreter}, representing how the list of + * resources should be allocated, this captures temporal ordering and other + * constraints. + * + * @param interpreter the {@link ReservationRequestInterpreter} for this + * reservation + */ + @Public + @Unstable + public abstract void setInterpreter(ReservationRequestInterpreter interpreter); + +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/3f1d205a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/applicationclient_protocol.proto ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/applicationclient_protocol.proto b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/applicationclient_protocol.proto index 2d8cae6..3346aef 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/applicationclient_protocol.proto +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/applicationclient_protocol.proto @@ -49,5 +49,8 @@ service ApplicationClientProtocolService { rpc getApplicationAttempts (GetApplicationAttemptsRequestProto) returns (GetApplicationAttemptsResponseProto); rpc getContainerReport (GetContainerReportRequestProto) returns (GetContainerReportResponseProto); rpc getContainers (GetContainersRequestProto) returns (GetContainersResponseProto); + rpc submitReservation (ReservationSubmissionRequestProto) returns (ReservationSubmissionResponseProto); + rpc updateReservation (ReservationUpdateRequestProto) returns (ReservationUpdateResponseProto); + rpc deleteReservation (ReservationDeleteRequestProto) returns (ReservationDeleteResponseProto); } http://git-wip-us.apache.org/repos/asf/hadoop/blob/3f1d205a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto index d8c42cc..dc9c661 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto @@ -292,6 +292,7 @@ message ApplicationSubmissionContextProto { optional bool keep_containers_across_application_attempts = 11 [default = false]; repeated string applicationTags = 12; optional int64 attempt_failures_validity_interval = 13 [default = -1]; + optional ReservationIdProto reservation_id = 14; } enum ApplicationAccessTypeProto { @@ -334,6 +335,41 @@ message QueueUserACLInfoProto { } //////////////////////////////////////////////////////////////////////// +////// From reservation_protocol ///////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +message ReservationIdProto { + optional int64 id = 1; + optional int64 cluster_timestamp = 2; +} + +message ReservationRequestProto { + optional ResourceProto capability = 1; + optional int32 num_containers = 2 [default = 1]; + optional int32 concurrency = 3 [default = 1]; + optional int64 duration = 4 [default = -1]; +} + +message ReservationRequestsProto { + repeated ReservationRequestProto reservation_resources = 1; + optional ReservationRequestInterpreterProto interpreter = 2 [default = R_ALL]; +} + +message ReservationDefinitionProto { + optional ReservationRequestsProto reservation_requests = 1; + optional int64 arrival = 2; + optional int64 deadline = 3; + optional string reservation_name = 4; +} + +enum ReservationRequestInterpreterProto { + R_ANY = 0; + R_ALL = 1; + R_ORDER = 2; + R_ORDER_NO_GAP = 3; + } + +//////////////////////////////////////////////////////////////////////// ////// From container_manager ////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// http://git-wip-us.apache.org/repos/asf/hadoop/blob/3f1d205a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto index 4203744..2585f78 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto @@ -292,3 +292,31 @@ message GetContainersRequestProto { message GetContainersResponseProto { repeated ContainerReportProto containers = 1; } + +////////////////////////////////////////////////////// +// reservation_protocol +////////////////////////////////////////////////////// + +message ReservationSubmissionRequestProto { + optional string queue = 1; + optional ReservationDefinitionProto reservation_definition = 2; +} + +message ReservationSubmissionResponseProto { + optional ReservationIdProto reservation_id = 1; +} + +message ReservationUpdateRequestProto { + optional ReservationDefinitionProto reservation_definition = 1; + optional ReservationIdProto reservation_id = 2; +} + +message ReservationUpdateResponseProto { +} + +message ReservationDeleteRequestProto { + optional ReservationIdProto reservation_id = 1; +} + +message ReservationDeleteResponseProto { +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/3f1d205a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/client/ApplicationClientProtocolPBClientImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/client/ApplicationClientProtocolPBClientImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/client/ApplicationClientProtocolPBClientImpl.java index 5794da0..b4b9f43 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/client/ApplicationClientProtocolPBClientImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/client/ApplicationClientProtocolPBClientImpl.java @@ -63,6 +63,12 @@ import org.apache.hadoop.yarn.api.protocolrecords.MoveApplicationAcrossQueuesReq import org.apache.hadoop.yarn.api.protocolrecords.MoveApplicationAcrossQueuesResponse; import org.apache.hadoop.yarn.api.protocolrecords.RenewDelegationTokenRequest; import org.apache.hadoop.yarn.api.protocolrecords.RenewDelegationTokenResponse; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteRequest; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteResponse; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionRequest; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionResponse; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateRequest; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateResponse; import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationRequest; import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationResponse; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.CancelDelegationTokenRequestPBImpl; @@ -97,6 +103,12 @@ import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.MoveApplicationAcrossQ import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.MoveApplicationAcrossQueuesResponsePBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.RenewDelegationTokenRequestPBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.RenewDelegationTokenResponsePBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationDeleteRequestPBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationDeleteResponsePBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationSubmissionRequestPBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationSubmissionResponsePBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationUpdateRequestPBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationUpdateResponsePBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.SubmitApplicationRequestPBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.SubmitApplicationResponsePBImpl; import org.apache.hadoop.yarn.exceptions.YarnException; @@ -110,13 +122,15 @@ import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetQueueInfoRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetQueueUserAclsInfoRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.KillApplicationRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.MoveApplicationAcrossQueuesRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationSubmissionRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationUpdateRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationDeleteRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.SubmitApplicationRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetApplicationAttemptsRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetApplicationAttemptReportRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetContainerReportRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetContainersRequestProto; - import com.google.protobuf.ServiceException; @Private @@ -391,4 +405,46 @@ public class ApplicationClientProtocolPBClientImpl implements ApplicationClientP } } + @Override + public ReservationSubmissionResponse submitReservation(ReservationSubmissionRequest request) + throws YarnException, IOException { + ReservationSubmissionRequestProto requestProto = + ((ReservationSubmissionRequestPBImpl) request).getProto(); + try { + return new ReservationSubmissionResponsePBImpl(proxy.submitReservation(null, + requestProto)); + } catch (ServiceException e) { + RPCUtil.unwrapAndThrowException(e); + return null; + } + } + + @Override + public ReservationUpdateResponse updateReservation(ReservationUpdateRequest request) + throws YarnException, IOException { + ReservationUpdateRequestProto requestProto = + ((ReservationUpdateRequestPBImpl) request).getProto(); + try { + return new ReservationUpdateResponsePBImpl(proxy.updateReservation(null, + requestProto)); + } catch (ServiceException e) { + RPCUtil.unwrapAndThrowException(e); + return null; + } + } + + @Override + public ReservationDeleteResponse deleteReservation(ReservationDeleteRequest request) + throws YarnException, IOException { + ReservationDeleteRequestProto requestProto = + ((ReservationDeleteRequestPBImpl) request).getProto(); + try { + return new ReservationDeleteResponsePBImpl(proxy.deleteReservation(null, + requestProto)); + } catch (ServiceException e) { + RPCUtil.unwrapAndThrowException(e); + return null; + } + } + } http://git-wip-us.apache.org/repos/asf/hadoop/blob/3f1d205a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/service/ApplicationClientProtocolPBServiceImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/service/ApplicationClientProtocolPBServiceImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/service/ApplicationClientProtocolPBServiceImpl.java index 1d9bedd..f73202d 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/service/ApplicationClientProtocolPBServiceImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/service/ApplicationClientProtocolPBServiceImpl.java @@ -45,6 +45,9 @@ import org.apache.hadoop.yarn.api.protocolrecords.GetQueueUserAclsInfoResponse; import org.apache.hadoop.yarn.api.protocolrecords.KillApplicationResponse; import org.apache.hadoop.yarn.api.protocolrecords.MoveApplicationAcrossQueuesResponse; import org.apache.hadoop.yarn.api.protocolrecords.RenewDelegationTokenResponse; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteResponse; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionResponse; +import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateResponse; import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationResponse; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.CancelDelegationTokenRequestPBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.CancelDelegationTokenResponsePBImpl; @@ -78,6 +81,12 @@ import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.MoveApplicationAcrossQ import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.MoveApplicationAcrossQueuesResponsePBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.RenewDelegationTokenRequestPBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.RenewDelegationTokenResponsePBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationDeleteRequestPBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationDeleteResponsePBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationSubmissionRequestPBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationSubmissionResponsePBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationUpdateRequestPBImpl; +import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.ReservationUpdateResponsePBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.SubmitApplicationRequestPBImpl; import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.SubmitApplicationResponsePBImpl; import org.apache.hadoop.yarn.exceptions.YarnException; @@ -99,6 +108,12 @@ import org.apache.hadoop.yarn.proto.YarnServiceProtos.KillApplicationRequestProt import org.apache.hadoop.yarn.proto.YarnServiceProtos.KillApplicationResponseProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.MoveApplicationAcrossQueuesRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.MoveApplicationAcrossQueuesResponseProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationSubmissionRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationSubmissionResponseProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationUpdateRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationUpdateResponseProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationDeleteRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationDeleteResponseProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.SubmitApplicationRequestProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.SubmitApplicationResponseProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetApplicationAttemptReportRequestProto; @@ -383,4 +398,50 @@ public class ApplicationClientProtocolPBServiceImpl implements ApplicationClient throw new ServiceException(e); } } + + @Override + public ReservationSubmissionResponseProto submitReservation(RpcController controller, + ReservationSubmissionRequestProto requestProto) throws ServiceException { + ReservationSubmissionRequestPBImpl request = + new ReservationSubmissionRequestPBImpl(requestProto); + try { + ReservationSubmissionResponse response = real.submitReservation(request); + return ((ReservationSubmissionResponsePBImpl) response).getProto(); + } catch (YarnException e) { + throw new ServiceException(e); + } catch (IOException e) { + throw new ServiceException(e); + } + } + + @Override + public ReservationUpdateResponseProto updateReservation(RpcController controller, + ReservationUpdateRequestProto requestProto) throws ServiceException { + ReservationUpdateRequestPBImpl request = + new ReservationUpdateRequestPBImpl(requestProto); + try { + ReservationUpdateResponse response = real.updateReservation(request); + return ((ReservationUpdateResponsePBImpl) response).getProto(); + } catch (YarnException e) { + throw new ServiceException(e); + } catch (IOException e) { + throw new ServiceException(e); + } + } + + @Override + public ReservationDeleteResponseProto deleteReservation(RpcController controller, + ReservationDeleteRequestProto requestProto) throws ServiceException { + ReservationDeleteRequestPBImpl request = + new ReservationDeleteRequestPBImpl(requestProto); + try { + ReservationDeleteResponse response = real.deleteReservation(request); + return ((ReservationDeleteResponsePBImpl) response).getProto(); + } catch (YarnException e) { + throw new ServiceException(e); + } catch (IOException e) { + throw new ServiceException(e); + } + } + } http://git-wip-us.apache.org/repos/asf/hadoop/blob/3f1d205a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationDeleteRequestPBImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationDeleteRequestPBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationDeleteRequestPBImpl.java new file mode 100644 index 0000000..c235dce --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationDeleteRequestPBImpl.java @@ -0,0 +1,127 @@ +/** + * 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.protocolrecords.impl.pb; + +import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteRequest; +import org.apache.hadoop.yarn.api.records.ReservationId; +import org.apache.hadoop.yarn.api.records.impl.pb.ReservationIdPBImpl; +import org.apache.hadoop.yarn.proto.YarnProtos.ReservationIdProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationDeleteRequestProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationDeleteRequestProtoOrBuilder; + +import com.google.protobuf.TextFormat; + +public class ReservationDeleteRequestPBImpl extends ReservationDeleteRequest { + + ReservationDeleteRequestProto proto = ReservationDeleteRequestProto + .getDefaultInstance(); + ReservationDeleteRequestProto.Builder builder = null; + boolean viaProto = false; + + private ReservationId reservationId; + + public ReservationDeleteRequestPBImpl() { + builder = ReservationDeleteRequestProto.newBuilder(); + } + + public ReservationDeleteRequestPBImpl(ReservationDeleteRequestProto proto) { + this.proto = proto; + viaProto = true; + } + + public ReservationDeleteRequestProto getProto() { + mergeLocalToProto(); + proto = viaProto ? proto : builder.build(); + viaProto = true; + return proto; + } + + private void mergeLocalToBuilder() { + if (this.reservationId != null) { + builder.setReservationId(convertToProtoFormat(this.reservationId)); + } + } + + private void mergeLocalToProto() { + if (viaProto) + maybeInitBuilder(); + mergeLocalToBuilder(); + proto = builder.build(); + viaProto = true; + } + + private void maybeInitBuilder() { + if (viaProto || builder == null) { + builder = ReservationDeleteRequestProto.newBuilder(proto); + } + viaProto = false; + } + + @Override + public ReservationId getReservationId() { + ReservationDeleteRequestProtoOrBuilder p = viaProto ? proto : builder; + if (reservationId != null) { + return reservationId; + } + if (!p.hasReservationId()) { + return null; + } + reservationId = convertFromProtoFormat(p.getReservationId()); + return reservationId; + } + + @Override + public void setReservationId(ReservationId reservationId) { + maybeInitBuilder(); + if (reservationId == null) { + builder.clearReservationId(); + return; + } + this.reservationId = reservationId; + } + + private ReservationIdPBImpl convertFromProtoFormat(ReservationIdProto p) { + return new ReservationIdPBImpl(p); + } + + private ReservationIdProto convertToProtoFormat(ReservationId t) { + return ((ReservationIdPBImpl) t).getProto(); + } + + @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()); + } + +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/3f1d205a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationDeleteResponsePBImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationDeleteResponsePBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationDeleteResponsePBImpl.java new file mode 100644 index 0000000..a249ab8 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/ReservationDeleteResponsePBImpl.java @@ -0,0 +1,68 @@ +/** + * 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.protocolrecords.impl.pb; + +import org.apache.hadoop.yarn.api.protocolrecords.ReservationDeleteResponse; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.ReservationDeleteResponseProto; + +import com.google.protobuf.TextFormat; + +public class ReservationDeleteResponsePBImpl extends ReservationDeleteResponse { + + ReservationDeleteResponseProto proto = ReservationDeleteResponseProto + .getDefaultInstance(); + ReservationDeleteResponseProto.Builder builder = null; + boolean viaProto = false; + + public ReservationDeleteResponsePBImpl() { + builder = ReservationDeleteResponseProto.newBuilder(); + } + + public ReservationDeleteResponsePBImpl(ReservationDeleteResponseProto proto) { + this.proto = proto; + viaProto = true; + } + + public ReservationDeleteResponseProto getProto() { + proto = viaProto ? proto : builder.build(); + viaProto = true; + return proto; + } + + @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()); + } + +}