diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java index d56fc64dce9..8c1a8b020a3 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java @@ -1245,6 +1245,15 @@ public static boolean isAclEnabled(Configuration conf) { public static final String NM_ADMIN_USER_ENV = NM_PREFIX + "admin-env"; public static final String DEFAULT_NM_ADMIN_USER_ENV = "MALLOC_ARENA_MAX=$MALLOC_ARENA_MAX"; + /** + * PATH components that will be prepended to the user's path. + * If this is defined and the user does not define PATH, NM will also + * append ":$PATH" to prevent this from eclipsing the PATH defined in + * the container. + * */ + public static final String NM_ADMIN_FORCE_PATH = NM_PREFIX + "force.path"; + public static final String DEFAULT_NM_ADMIN_FORCE_PATH = ""; + /** Environment variables that containers may override rather than use NodeManager's default.*/ public static final String NM_ENV_WHITELIST = NM_PREFIX + "env-whitelist"; public static final String DEFAULT_NM_ENV_WHITELIST = StringUtils.join(",", diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml index 23eba6e6075..5a0c25ef415 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml @@ -1195,6 +1195,17 @@ MALLOC_ARENA_MAX=$MALLOC_ARENA_MAX + + + * PATH components that will be prepended to the user's path. + * If this is defined and the user does not define PATH, NM will also + * append ":$PATH" to prevent this from eclipsing the PATH defined in + * the container. + + yarn.nodemanager.force.path + + + Environment variables that containers may override rather than use NodeManager's default. yarn.nodemanager.env-whitelist diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/ContainerLaunch.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/ContainerLaunch.java index 8f251b57818..dbc85748b21 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/ContainerLaunch.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/ContainerLaunch.java @@ -1636,6 +1636,25 @@ public void sanitizeEnv(Map environment, Path pwd, nmVars.addAll(Apps.getEnvVarsFromInputProperty( YarnConfiguration.NM_ADMIN_USER_ENV, defEnvStr, conf)); + // maybe force path components + String forcePath = conf.get(YarnConfiguration.NM_ADMIN_FORCE_PATH, + YarnConfiguration.DEFAULT_NM_ADMIN_FORCE_PATH); + if (!forcePath.isEmpty()) { + String userPath = environment.get(Environment.PATH.name()); + environment.remove(Environment.PATH.name()); + if (userPath == null || userPath.isEmpty()) { + Apps.addToEnvironment(environment, Environment.PATH.name(), + forcePath, File.pathSeparator); + Apps.addToEnvironment(environment, Environment.PATH.name(), + "$PATH", File.pathSeparator); + } else { + Apps.addToEnvironment(environment, Environment.PATH.name(), + forcePath, File.pathSeparator); + Apps.addToEnvironment(environment, Environment.PATH.name(), + userPath, File.pathSeparator); + } + } + // TODO: Remove Windows check and use this approach on all platforms after // additional testing. See YARN-358. if (Shell.WINDOWS) {