| /** |
| * 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.capacity; |
| |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| import org.apache.hadoop.classification.InterfaceAudience.Private; |
| import org.apache.hadoop.conf.Configuration; |
| import org.apache.hadoop.security.authorize.AccessControlList; |
| import org.apache.hadoop.util.StringUtils; |
| import org.apache.hadoop.yarn.api.records.QueueACL; |
| import org.apache.hadoop.yarn.api.records.QueueState; |
| import org.apache.hadoop.yarn.api.records.Resource; |
| import org.apache.hadoop.yarn.server.resourcemanager.resource.Resources; |
| |
| public class CapacitySchedulerConfiguration extends Configuration { |
| |
| private static final Log LOG = |
| LogFactory.getLog(CapacitySchedulerConfiguration.class); |
| |
| private static final String CS_CONFIGURATION_FILE = "capacity-scheduler.xml"; |
| |
| @Private |
| public static final String PREFIX = "yarn.scheduler.capacity."; |
| |
| @Private |
| public static final String DOT = "."; |
| |
| @Private |
| public static final String MAXIMUM_SYSTEM_APPLICATIONS = |
| PREFIX + "maximum-applications"; |
| |
| @Private |
| public static final String MAXIMUM_APPLICATION_MASTERS_RESOURCE_PERCENT = |
| PREFIX + "maximum-am-resource-percent"; |
| |
| @Private |
| public static final String QUEUES = "queues"; |
| |
| @Private |
| public static final String CAPACITY = "capacity"; |
| |
| @Private |
| public static final String MAXIMUM_CAPACITY = "maximum-capacity"; |
| |
| @Private |
| public static final String USER_LIMIT = "minimum-user-limit-percent"; |
| |
| @Private |
| public static final String USER_LIMIT_FACTOR = "user-limit-factor"; |
| |
| @Private |
| public static final String STATE = "state"; |
| |
| private static final int MINIMUM_MEMORY = 1024; |
| |
| @Private |
| public static final String MINIMUM_ALLOCATION = |
| PREFIX + "minimum-allocation-mb"; |
| |
| private static final int MAXIMUM_MEMORY = 10240; |
| |
| @Private |
| public static final String MAXIMUM_ALLOCATION = |
| PREFIX + "maximum-allocation-mb"; |
| |
| @Private |
| public static final int DEFAULT_MAXIMUM_SYSTEM_APPLICATIIONS = 10000; |
| |
| @Private |
| public static final float |
| DEFAULT_MAXIMUM_APPLICATIONMASTERS_RESOURCE_PERCENT = 0.1f; |
| |
| @Private |
| public static final int UNDEFINED = -1; |
| |
| @Private |
| public static final int MINIMUM_CAPACITY_VALUE = 1; |
| |
| @Private |
| public static final int MAXIMUM_CAPACITY_VALUE = 100; |
| |
| @Private |
| public static final int DEFAULT_USER_LIMIT = 100; |
| |
| @Private |
| public static final float DEFAULT_USER_LIMIT_FACTOR = 1.0f; |
| |
| @Private |
| public static final String ALL_ACL = "*"; |
| |
| @Private |
| public static final String NONE_ACL = " "; |
| |
| @Private public static final String ENABLE_USER_METRICS = |
| PREFIX +"user-metrics.enable"; |
| @Private public static final boolean DEFAULT_ENABLE_USER_METRICS = false; |
| |
| @Private |
| public static final String ROOT = "root"; |
| |
| public CapacitySchedulerConfiguration() { |
| this(new Configuration()); |
| } |
| |
| public CapacitySchedulerConfiguration(Configuration configuration) { |
| super(configuration); |
| addResource(CS_CONFIGURATION_FILE); |
| } |
| |
| private String getQueuePrefix(String queue) { |
| String queueName = PREFIX + queue + DOT; |
| return queueName; |
| } |
| |
| public int getMaximumSystemApplications() { |
| int maxApplications = |
| getInt(MAXIMUM_SYSTEM_APPLICATIONS, DEFAULT_MAXIMUM_SYSTEM_APPLICATIIONS); |
| return maxApplications; |
| } |
| |
| public float getMaximumApplicationMasterResourcePercent() { |
| return getFloat(MAXIMUM_APPLICATION_MASTERS_RESOURCE_PERCENT, |
| DEFAULT_MAXIMUM_APPLICATIONMASTERS_RESOURCE_PERCENT); |
| } |
| |
| public int getCapacity(String queue) { |
| int capacity = getInt(getQueuePrefix(queue) + CAPACITY, UNDEFINED); |
| if (capacity < MINIMUM_CAPACITY_VALUE || capacity > MAXIMUM_CAPACITY_VALUE) { |
| throw new IllegalArgumentException("Illegal " + |
| "capacity of " + capacity + " for queue " + queue); |
| } |
| LOG.debug("CSConf - getCapacity: queuePrefix=" + getQueuePrefix(queue) + |
| ", capacity=" + capacity); |
| return capacity; |
| } |
| |
| public void setCapacity(String queue, int capacity) { |
| setInt(getQueuePrefix(queue) + CAPACITY, capacity); |
| LOG.debug("CSConf - setCapacity: queuePrefix=" + getQueuePrefix(queue) + |
| ", capacity=" + capacity); |
| } |
| |
| public int getMaximumCapacity(String queue) { |
| int maxCapacity = |
| getInt(getQueuePrefix(queue) + MAXIMUM_CAPACITY, MAXIMUM_CAPACITY_VALUE); |
| return maxCapacity; |
| } |
| |
| public void setMaximumCapacity(String queue, int maxCapacity) { |
| if (maxCapacity > MAXIMUM_CAPACITY_VALUE) { |
| throw new IllegalArgumentException("Illegal " + |
| "maximum-capacity of " + maxCapacity + " for queue " + queue); |
| } |
| setInt(getQueuePrefix(queue) + MAXIMUM_CAPACITY, maxCapacity); |
| LOG.debug("CSConf - setMaxCapacity: queuePrefix=" + getQueuePrefix(queue) + |
| ", maxCapacity=" + maxCapacity); |
| } |
| |
| public int getUserLimit(String queue) { |
| int userLimit = |
| getInt(getQueuePrefix(queue) + USER_LIMIT, DEFAULT_USER_LIMIT); |
| return userLimit; |
| } |
| |
| public void setUserLimit(String queue, int userLimit) { |
| setInt(getQueuePrefix(queue) + USER_LIMIT, userLimit); |
| LOG.debug("here setUserLimit: queuePrefix=" + getQueuePrefix(queue) + |
| ", userLimit=" + getUserLimit(queue)); |
| } |
| |
| public float getUserLimitFactor(String queue) { |
| float userLimitFactor = |
| getFloat(getQueuePrefix(queue) + USER_LIMIT_FACTOR, |
| DEFAULT_USER_LIMIT_FACTOR); |
| return userLimitFactor; |
| } |
| |
| public void setUserLimitFactor(String queue, float userLimitFactor) { |
| setFloat(getQueuePrefix(queue) + USER_LIMIT_FACTOR, userLimitFactor); |
| } |
| |
| public QueueState getState(String queue) { |
| String state = get(getQueuePrefix(queue) + STATE); |
| return (state != null) ? |
| QueueState.valueOf(state.toUpperCase()) : QueueState.RUNNING; |
| } |
| |
| private static String getAclKey(QueueACL acl) { |
| return "acl_" + acl.toString().toLowerCase(); |
| } |
| |
| public AccessControlList getAcl(String queue, QueueACL acl) { |
| String queuePrefix = getQueuePrefix(queue); |
| // The root queue defaults to all access if not defined |
| // Sub queues inherit access if not defined |
| String defaultAcl = queue.equals(ROOT) ? ALL_ACL : NONE_ACL; |
| String aclString = get(queuePrefix + getAclKey(acl), defaultAcl); |
| return new AccessControlList(aclString); |
| } |
| |
| public void setAcl(String queue, QueueACL acl, String aclString) { |
| String queuePrefix = getQueuePrefix(queue); |
| set(queuePrefix + getAclKey(acl), aclString); |
| } |
| |
| public Map<QueueACL, AccessControlList> getAcls(String queue) { |
| Map<QueueACL, AccessControlList> acls = |
| new HashMap<QueueACL, AccessControlList>(); |
| for (QueueACL acl : QueueACL.values()) { |
| acls.put(acl, getAcl(queue, acl)); |
| } |
| return acls; |
| } |
| |
| public void setAcls(String queue, Map<QueueACL, AccessControlList> acls) { |
| for (Map.Entry<QueueACL, AccessControlList> e : acls.entrySet()) { |
| setAcl(queue, e.getKey(), e.getValue().getAclString()); |
| } |
| } |
| |
| public String[] getQueues(String queue) { |
| LOG.debug("CSConf - getQueues called for: queuePrefix=" + getQueuePrefix(queue)); |
| String[] queues = getStrings(getQueuePrefix(queue) + QUEUES); |
| LOG.debug("CSConf - getQueues: queuePrefix=" + getQueuePrefix(queue) + |
| ", queues=" + ((queues == null) ? "" : StringUtils.arrayToString(queues))); |
| return queues; |
| } |
| |
| public void setQueues(String queue, String[] subQueues) { |
| set(getQueuePrefix(queue) + QUEUES, StringUtils.arrayToString(subQueues)); |
| LOG.debug("CSConf - setQueues: qPrefix=" + getQueuePrefix(queue) + |
| ", queues=" + StringUtils.arrayToString(subQueues)); |
| } |
| |
| public Resource getMinimumAllocation() { |
| int minimumMemory = getInt(MINIMUM_ALLOCATION, MINIMUM_MEMORY); |
| return Resources.createResource(minimumMemory); |
| } |
| |
| public Resource getMaximumAllocation() { |
| int maximumMemory = getInt(MAXIMUM_ALLOCATION, MAXIMUM_MEMORY); |
| return Resources.createResource(maximumMemory); |
| } |
| |
| public boolean getEnableUserMetrics() { |
| return getBoolean(ENABLE_USER_METRICS, DEFAULT_ENABLE_USER_METRICS); |
| } |
| } |