You are viewing a plain text version of this content. The canonical link for it is here.
Posted to yarn-commits@hadoop.apache.org by tg...@apache.org on 2013/03/08 15:50:40 UTC
svn commit: r1454412 - in
/hadoop/common/branches/branch-0.23/hadoop-yarn-project: ./
hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/conf/
hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoo...
Author: tgraves
Date: Fri Mar 8 14:50:39 2013
New Revision: 1454412
URL: http://svn.apache.org/r1454412
Log:
YARN-443. allow OS scheduling priority of NM to be different than the containers it launches (tgraves)
Modified:
hadoop/common/branches/branch-0.23/hadoop-yarn-project/CHANGES.txt
hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java
hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/ContainerExecutor.java
hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/DefaultContainerExecutor.java
hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/LinuxContainerExecutor.java
hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestLinuxContainerExecutorWithMocks.java
Modified: hadoop/common/branches/branch-0.23/hadoop-yarn-project/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-yarn-project/CHANGES.txt?rev=1454412&r1=1454411&r2=1454412&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-yarn-project/CHANGES.txt (original)
+++ hadoop/common/branches/branch-0.23/hadoop-yarn-project/CHANGES.txt Fri Mar 8 14:50:39 2013
@@ -29,6 +29,9 @@ Release 0.23.7 - UNRELEASED
the per-application page are translated to html line breaks. (Omkar Vinit
Joshi via vinodkv)
+ YARN-443. allow OS scheduling priority of NM to be different than the
+ containers it launches (tgraves)
+
OPTIMIZATIONS
YARN-357. App submission should not be synchronized (daryn)
Modified: hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java?rev=1454412&r1=1454411&r2=1454412&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java Fri Mar 8 14:50:39 2013
@@ -294,6 +294,17 @@ public class YarnConfiguration extends C
/** who will execute(launch) the containers.*/
public static final String NM_CONTAINER_EXECUTOR =
NM_PREFIX + "container-executor.class";
+
+ /**
+ * Adjustment to make to the container os scheduling priority.
+ * The valid values for this could vary depending on the platform.
+ * On Linux, higher values mean run the containers at a less
+ * favorable priority than the NM.
+ * The value specified is an int.
+ */
+ public static final String NM_CONTAINER_EXECUTOR_SCHED_PRIORITY =
+ NM_PREFIX + "container-executor.os.sched.priority.adjustment";
+ public static final int DEFAULT_NM_CONTAINER_EXECUTOR_SCHED_PRIORITY = 0;
/** Number of threads container manager uses.*/
public static final String NM_CONTAINER_MGR_THREAD_COUNT =
Modified: hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/ContainerExecutor.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/ContainerExecutor.java?rev=1454412&r1=1454411&r2=1454412&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/ContainerExecutor.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/ContainerExecutor.java Fri Mar 8 14:50:39 2013
@@ -20,6 +20,8 @@ package org.apache.hadoop.yarn.server.no
import java.io.IOException;
import java.net.InetSocketAddress;
+import java.util.Arrays;
+import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@@ -35,6 +37,7 @@ import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.permission.FsPermission;
import org.apache.hadoop.util.Shell.ShellCommandExecutor;
import org.apache.hadoop.yarn.api.records.ContainerId;
+import org.apache.hadoop.yarn.conf.YarnConfiguration;
import org.apache.hadoop.yarn.server.nodemanager.containermanager.container.Container;
import org.apache.hadoop.yarn.server.nodemanager.util.ProcessIdFileReader;
@@ -183,6 +186,23 @@ public abstract class ContainerExecutor
}
}
+ /**
+ * Return a command to execute the given command in OS shell.
+ */
+ protected static String[] getRunCommand(String command, Configuration conf) {
+ List<String> retCommand = new ArrayList<String>();
+ if (conf.get(YarnConfiguration.NM_CONTAINER_EXECUTOR_SCHED_PRIORITY) !=
+ null) {
+ int containerSchedPriorityAdjustment = conf
+ .getInt(YarnConfiguration.NM_CONTAINER_EXECUTOR_SCHED_PRIORITY, 0);
+ retCommand.addAll(Arrays.asList("nice", "-n",
+ Integer.toString(containerSchedPriorityAdjustment)));
+ }
+ retCommand.addAll(Arrays.asList("bash", "-c", command));
+ return retCommand.toArray(new String[retCommand.size()]);
+ }
+
+
/**
* Is the container still active?
* @param containerId
Modified: hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/DefaultContainerExecutor.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/DefaultContainerExecutor.java?rev=1454412&r1=1454411&r2=1454412&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/DefaultContainerExecutor.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/DefaultContainerExecutor.java Fri Mar 8 14:50:39 2013
@@ -169,9 +169,11 @@ public class DefaultContainerExecutor ex
lfs.setPermission(wrapperScriptDst,
ContainerExecutor.TASK_LAUNCH_SCRIPT_PERMISSION);
+ // Setup command to run
+ String[] command = getRunCommand(wrapperScriptDst.toUri().getPath().toString(),
+ this.getConf());
+
// Setup command to run
- String[] command = {"bash",
- wrapperScriptDst.toUri().getPath().toString()};
LOG.info("launchContainer: " + Arrays.toString(command));
shExec = new ShellCommandExecutor(
command,
Modified: hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/LinuxContainerExecutor.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/LinuxContainerExecutor.java?rev=1454412&r1=1454411&r2=1454412&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/LinuxContainerExecutor.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/LinuxContainerExecutor.java Fri Mar 8 14:50:39 2013
@@ -45,11 +45,19 @@ public class LinuxContainerExecutor exte
.getLog(LinuxContainerExecutor.class);
private String containerExecutorExe;
+ private boolean containerSchedPriorityIsSet = false;
+ private int containerSchedPriorityAdjustment = 0;
@Override
public void setConf(Configuration conf) {
super.setConf(conf);
containerExecutorExe = getContainerExecutorExecutablePath(conf);
+ if (conf.get(YarnConfiguration.NM_CONTAINER_EXECUTOR_SCHED_PRIORITY) != null) {
+ containerSchedPriorityIsSet = true;
+ containerSchedPriorityAdjustment = conf
+ .getInt(YarnConfiguration.NM_CONTAINER_EXECUTOR_SCHED_PRIORITY,
+ YarnConfiguration.DEFAULT_NM_CONTAINER_EXECUTOR_SCHED_PRIORITY);
+ }
}
/**
@@ -100,6 +108,13 @@ public class LinuxContainerExecutor exte
: conf.get(YarnConfiguration.NM_LINUX_CONTAINER_EXECUTOR_PATH, defaultPath);
}
+ protected void addSchedPriorityCommand(List<String> command) {
+ if (containerSchedPriorityIsSet) {
+ command.addAll(Arrays.asList("nice", "-n",
+ Integer.toString(containerSchedPriorityAdjustment)));
+ }
+ }
+
@Override
public void init() throws IOException {
// Send command to executor which will just start up,
@@ -129,14 +144,15 @@ public class LinuxContainerExecutor exte
List<String> localDirs, List<String> logDirs)
throws IOException, InterruptedException {
- List<String> command = new ArrayList<String>(
- Arrays.asList(containerExecutorExe,
- user,
- Integer.toString(Commands.INITIALIZE_CONTAINER.getValue()),
- appId,
- nmPrivateContainerTokensPath.toUri().getPath().toString(),
- StringUtils.join(",", localDirs),
- StringUtils.join(",", logDirs)));
+ List<String> command = new ArrayList<String>();
+ addSchedPriorityCommand(command);
+ command.addAll(Arrays.asList(containerExecutorExe,
+ user,
+ Integer.toString(Commands.INITIALIZE_CONTAINER.getValue()),
+ appId,
+ nmPrivateContainerTokensPath.toUri().getPath().toString(),
+ StringUtils.join(",", localDirs),
+ StringUtils.join(",", logDirs)));
File jvm = // use same jvm as parent
new File(new File(System.getProperty("java.home"), "bin"), "java");
@@ -191,7 +207,9 @@ public class LinuxContainerExecutor exte
try {
Path pidFilePath = getPidFilePath(containerId);
if (pidFilePath != null) {
- List<String> command = new ArrayList<String>(Arrays.asList(
+ List<String> command = new ArrayList<String>();
+ addSchedPriorityCommand(command);
+ command.addAll(Arrays.asList(
containerExecutorExe, user, Integer
.toString(Commands.LAUNCH_CONTAINER.getValue()), appId,
containerIdStr, containerWorkDir.toString(),
Modified: hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestLinuxContainerExecutorWithMocks.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestLinuxContainerExecutorWithMocks.java?rev=1454412&r1=1454411&r2=1454412&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestLinuxContainerExecutorWithMocks.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestLinuxContainerExecutorWithMocks.java Fri Mar 8 14:50:39 2013
@@ -27,6 +27,7 @@ import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.net.InetSocketAddress;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
@@ -131,8 +132,40 @@ public class TestLinuxContainerExecutorW
}
+ @Test (timeout = 5000)
+ public void testContainerLaunchWithPriority() throws IOException {
+
+ // set the scheduler priority to make sure still works with nice -n prio
+ File f = new File("./src/test/resources/mock-container-executor");
+ if (!f.canExecute()) {
+ f.setExecutable(true);
+ }
+ String executorPath = f.getAbsolutePath();
+ Configuration conf = new Configuration();
+ conf.set(YarnConfiguration.NM_LINUX_CONTAINER_EXECUTOR_PATH, executorPath);
+ conf.setInt(YarnConfiguration.NM_CONTAINER_EXECUTOR_SCHED_PRIORITY, 2);
+
+ mockExec.setConf(conf);
+ List<String> command = new ArrayList<String>();
+ mockExec.addSchedPriorityCommand(command);
+ assertEquals("first should be nice", "nice", command.get(0));
+ assertEquals("second should be -n", "-n", command.get(1));
+ assertEquals("third should be the priority", Integer.toString(2),
+ command.get(2));
+
+ testContainerLaunch();
+ }
+
+ @Test (timeout = 5000)
+ public void testLaunchCommandWithoutPriority() throws IOException {
+ // make sure the command doesn't contain the nice -n since priority
+ // not specified
+ List<String> command = new ArrayList<String>();
+ mockExec.addSchedPriorityCommand(command);
+ assertEquals("addSchedPriority should be empty", 0, command.size());
+ }
- @Test
+ @Test (timeout = 5000)
public void testStartLocalizer() throws IOException {