/** * 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.server.resourcemanager.scheduler; import java.util.List; import org.apache.hadoop.classification.InterfaceAudience.Private; import org.apache.hadoop.classification.InterfaceStability.Unstable; import org.apache.hadoop.yarn.api.records.ContainerId; import org.apache.hadoop.yarn.api.records.ContainerState; import org.apache.hadoop.yarn.api.records.ContainerStatus; import org.apache.hadoop.yarn.api.records.ResourceRequest; import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.factories.RecordFactory; import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider; /** * Utilities shared by schedulers. */ @Private @Unstable public class SchedulerUtils { private static final RecordFactory recordFactory = RecordFactoryProvider.getRecordFactory(null); public static final String RELEASED_CONTAINER = "Container released by application"; public static final String LOST_CONTAINER = "Container released on a *lost* node"; public static final String COMPLETED_APPLICATION = "Container of a completed application"; public static final String EXPIRED_CONTAINER = "Container expired since it was unused"; public static final String UNRESERVED_CONTAINER = "Container reservation no longer required."; /** * Utility to create a {@link ContainerStatus} during exceptional * circumstances. * * @param containerId {@link ContainerId} of returned/released/lost container. * @param diagnostics diagnostic message * @return <code>ContainerStatus</code> for an returned/released/lost * container */ public static ContainerStatus createAbnormalContainerStatus( ContainerId containerId, String diagnostics) { ContainerStatus containerStatus = recordFactory.newRecordInstance(ContainerStatus.class); containerStatus.setContainerId(containerId); containerStatus.setDiagnostics(diagnostics); containerStatus.setExitStatus( YarnConfiguration.ABORTED_CONTAINER_EXIT_STATUS); containerStatus.setState(ContainerState.COMPLETE); return containerStatus; } /** * Utility method to normalize a list of resource requests, by insuring that * the memory for each request is a multiple of minMemory and is not zero. * * @param asks * a list of resource requests. * @param minMemory * the configured minimum memory allocation. */ public static void normalizeRequests(List<ResourceRequest> asks, int minMemory) { for (ResourceRequest ask : asks) { normalizeRequest(ask, minMemory); } } /** * Utility method to normalize a resource request, by insuring that the * requested memory is a multiple of minMemory and is not zero. * * @param ask * the resource request. * @param minMemory * the configured minimum memory allocation. */ public static void normalizeRequest(ResourceRequest ask, int minMemory) { int memory = Math.max(ask.getCapability().getMemory(), minMemory); ask.getCapability().setMemory( minMemory * ((memory / minMemory) + (memory % minMemory > 0 ? 1 : 0))); } }