| /* |
| * 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.twill.internal.yarn.ports; |
| |
| import org.apache.hadoop.yarn.api.protocolrecords.RegisterApplicationMasterResponse; |
| import org.apache.hadoop.yarn.api.records.ContainerId; |
| import org.apache.hadoop.yarn.api.records.FinalApplicationStatus; |
| import org.apache.hadoop.yarn.api.records.Priority; |
| import org.apache.hadoop.yarn.api.records.Resource; |
| import org.apache.hadoop.yarn.exceptions.YarnRemoteException; |
| import org.apache.hadoop.yarn.service.Service; |
| |
| /** |
| * Ported from Apache Hadoop YARN. |
| */ |
| public interface AMRMClient extends Service { |
| |
| /** |
| * Value used to define no locality. |
| */ |
| static final String ANY = "*"; |
| |
| /** |
| * Object to represent container request for resources. |
| * Resources may be localized to nodes and racks. |
| * Resources may be assigned priorities. |
| * Can ask for multiple containers of a given type. |
| */ |
| public static class ContainerRequest { |
| Resource capability; |
| String[] hosts; |
| String[] racks; |
| Priority priority; |
| int containerCount; |
| |
| public ContainerRequest(Resource capability, String[] hosts, |
| String[] racks, Priority priority, int containerCount) { |
| this.capability = capability; |
| this.hosts = (hosts != null ? hosts.clone() : null); |
| this.racks = (racks != null ? racks.clone() : null); |
| this.priority = priority; |
| this.containerCount = containerCount; |
| } |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append("Capability[").append(capability).append("]"); |
| sb.append("Priority[").append(priority).append("]"); |
| sb.append("ContainerCount[").append(containerCount).append("]"); |
| return sb.toString(); |
| } |
| } |
| |
| /** |
| * Register the application master. This must be called before any |
| * other interaction |
| * @param appHostName Name of the host on which master is running |
| * @param appHostPort Port master is listening on |
| * @param appTrackingUrl URL at which the master info can be seen |
| * @return <code>RegisterApplicationMasterResponse</code> |
| * @throws org.apache.hadoop.yarn.exceptions.YarnRemoteException |
| */ |
| public RegisterApplicationMasterResponse |
| registerApplicationMaster(String appHostName, |
| int appHostPort, |
| String appTrackingUrl) |
| throws YarnRemoteException; |
| |
| /** |
| * Request additional containers and receive new container allocations. |
| * Requests made via <code>addContainerRequest</code> are sent to the |
| * <code>ResourceManager</code>. New containers assigned to the master are |
| * retrieved. Status of completed containers and node health updates are |
| * also retrieved. |
| * This also doubles as a heartbeat to the ResourceManager and must be |
| * made periodically. |
| * The call may not always return any new allocations of containers. |
| * App should not make concurrent allocate requests. May cause request loss. |
| * @param progressIndicator Indicates progress made by the master |
| * @return the response of the allocate request |
| * @throws YarnRemoteException |
| */ |
| public AllocationResponse allocate(float progressIndicator) |
| throws YarnRemoteException; |
| |
| /** |
| * Unregister the Application Master. This must be called in the end. |
| * @param appStatus Success/Failure status of the master |
| * @param appMessage Diagnostics message on failure |
| * @param appTrackingUrl New URL to get master info |
| * @throws YarnRemoteException |
| */ |
| public void unregisterApplicationMaster(FinalApplicationStatus appStatus, |
| String appMessage, |
| String appTrackingUrl) |
| throws YarnRemoteException; |
| |
| /** |
| * Request containers for resources before calling <code>allocate</code>. |
| * @param req Resource request |
| */ |
| public void addContainerRequest(ContainerRequest req); |
| |
| /** |
| * Remove previous container request. The previous container request may have |
| * already been sent to the ResourceManager. So even after the remove request |
| * the app must be prepared to receive an allocation for the previous request |
| * even after the remove request |
| * @param req Resource request |
| */ |
| public void removeContainerRequest(ContainerRequest req); |
| |
| /** |
| * Release containers assigned by the Resource Manager. If the app cannot use |
| * the container or wants to give up the container then it can release it. |
| * The app needs to make new requests for the released resource capability if |
| * it still needs it. For example, if it released non-local resources |
| * @param containerId |
| */ |
| public void releaseAssignedContainer(ContainerId containerId); |
| |
| /** |
| * Get the currently available resources in the cluster. |
| * A valid value is available after a call to allocate has been made |
| * @return Currently available resources |
| */ |
| public Resource getClusterAvailableResources(); |
| |
| /** |
| * Get the current number of nodes in the cluster. |
| * A valid values is available after a call to allocate has been made |
| * @return Current number of nodes in the cluster |
| */ |
| public int getClusterNodeCount(); |
| } |