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) {