This is an automated email from the ASF dual-hosted git repository.

bteke pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/hadoop.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 16edb4ac9629 YARN-11630. Passing admin Java options to container 
localizers (#6349)
16edb4ac9629 is described below

commit 16edb4ac9629206fcd52a05326f5e625715287e4
Author: Peter Szucs <116345192+p-sz...@users.noreply.github.com>
AuthorDate: Thu Dec 14 16:52:57 2023 +0100

    YARN-11630. Passing admin Java options to container localizers (#6349)
---
 .../apache/hadoop/yarn/conf/YarnConfiguration.java |  7 +++
 .../src/main/resources/yarn-default.xml            |  9 ++++
 .../localizer/ContainerLocalizer.java              | 17 ++++--
 .../localizer/TestContainerLocalizer.java          | 62 ++++++++++++++++++++++
 4 files changed, 92 insertions(+), 3 deletions(-)

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 d195c8cdae68..0ab4107c1320 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
@@ -2232,6 +2232,13 @@ public class YarnConfiguration extends Configuration {
   public static final String NM_CONTAINER_LOCALIZER_JAVA_OPTS_DEFAULT =
       "-Xmx256m";
 
+  /** The admin JVM options used on forking ContainerLocalizer process
+      by container executor. */
+  public static final String NM_CONTAINER_LOCALIZER_ADMIN_JAVA_OPTS_KEY =
+      NM_PREFIX + "container-localizer.admin.java.opts";
+
+  public static final String NM_CONTAINER_LOCALIZER_ADMIN_JAVA_OPTS_DEFAULT = 
"";
+
   /*
    * Flag to indicate whether JDK17's required add-exports flags should be 
added to
    * container localizers regardless of the user specified JAVA_OPTS.
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 b8892e4fc12e..41e38f601cbd 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
@@ -1488,6 +1488,15 @@
     <value>-Xmx256m</value>
   </property>
 
+  <property>
+    <description>
+      The admin JVM options used on forking ContainerLocalizer process
+      by the container executor.
+    </description>
+    <name>yarn.nodemanager.container-localizer.admin.java.opts</name>
+    <value></value>
+  </property>
+
   <property>
     
<name>yarn.nodemanager.container-localizer.java.opts.add-exports-as-default</name>
     <value>true</value>
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/localizer/ContainerLocalizer.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/ContainerLocalizer.java
index c928b19874ed..0477e7320fee 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/ContainerLocalizer.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/ContainerLocalizer.java
@@ -47,6 +47,8 @@ import java.util.concurrent.ExecutorCompletionService;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import org.apache.hadoop.classification.InterfaceAudience.Private;
 import org.apache.hadoop.conf.Configuration;
@@ -406,16 +408,25 @@ public class ContainerLocalizer {
    * @param conf the configuration properties to launch the resource localizer.
    */
   public static List<String> getJavaOpts(Configuration conf) {
-    String opts = 
conf.get(YarnConfiguration.NM_CONTAINER_LOCALIZER_JAVA_OPTS_KEY,
+    String adminOpts = 
conf.get(YarnConfiguration.NM_CONTAINER_LOCALIZER_ADMIN_JAVA_OPTS_KEY,
+        YarnConfiguration.NM_CONTAINER_LOCALIZER_ADMIN_JAVA_OPTS_DEFAULT);
+    String userOpts = 
conf.get(YarnConfiguration.NM_CONTAINER_LOCALIZER_JAVA_OPTS_KEY,
         YarnConfiguration.NM_CONTAINER_LOCALIZER_JAVA_OPTS_DEFAULT);
+
     boolean isExtraJDK17OptionsConfigured =
         
conf.getBoolean(YarnConfiguration.NM_CONTAINER_LOCALIZER_JAVA_OPTS_ADD_EXPORTS_KEY,
         
YarnConfiguration.NM_CONTAINER_LOCALIZER_JAVA_OPTS_ADD_EXPORTS_DEFAULT);
 
     if (Shell.isJavaVersionAtLeast(17) && isExtraJDK17OptionsConfigured) {
-      opts = opts.trim().concat(" " + ADDITIONAL_JDK17_PLUS_OPTIONS);
+      userOpts = userOpts.trim().concat(" " + ADDITIONAL_JDK17_PLUS_OPTIONS);
     }
-    return Arrays.asList(opts.split(" "));
+
+    List<String> adminOptionList = Arrays.asList(adminOpts.split("\\s+"));
+    List<String> userOptionList = Arrays.asList(userOpts.split("\\s+"));
+
+    return Stream.concat(adminOptionList.stream(), userOptionList.stream())
+        .filter(s -> !s.isEmpty())
+        .collect(Collectors.toList());
   }
 
   /**
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/TestContainerLocalizer.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/TestContainerLocalizer.java
index 76aa73142e0c..8bde60e8db98 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/TestContainerLocalizer.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/TestContainerLocalizer.java
@@ -737,4 +737,66 @@ static DataInputBuffer createFakeCredentials(Random r, int 
nTok)
     }
     Assert.assertTrue(javaOpts.contains("-Xmx256m"));
   }
+
+  @Test
+  public void testAdminOptionsPrecedeUserDefinedJavaOptions() throws Exception 
{
+    ContainerLocalizerWrapper wrapper = new ContainerLocalizerWrapper();
+    ContainerLocalizer localizer = wrapper.setupContainerLocalizerForTest();
+
+    Configuration conf = new Configuration();
+    
conf.setStrings(YarnConfiguration.NM_CONTAINER_LOCALIZER_ADMIN_JAVA_OPTS_KEY,
+        "adminOption1 adminOption2");
+    conf.setStrings(YarnConfiguration.NM_CONTAINER_LOCALIZER_JAVA_OPTS_KEY,
+        " userOption1 userOption2");
+    List<String> javaOpts = localizer.getJavaOpts(conf);
+
+    Assert.assertEquals(4, javaOpts.size());
+    Assert.assertTrue(javaOpts.get(0).equals("adminOption1"));
+    Assert.assertTrue(javaOpts.get(1).equals("adminOption2"));
+    Assert.assertTrue(javaOpts.get(2).equals("userOption1"));
+    Assert.assertTrue(javaOpts.get(3).equals("userOption2"));
+  }
+
+  @Test
+  public void testAdminOptionsPrecedeDefaultUserOptions() throws Exception {
+    ContainerLocalizerWrapper wrapper = new ContainerLocalizerWrapper();
+    ContainerLocalizer localizer = wrapper.setupContainerLocalizerForTest();
+
+    Configuration conf = new Configuration();
+    
conf.setStrings(YarnConfiguration.NM_CONTAINER_LOCALIZER_ADMIN_JAVA_OPTS_KEY,
+        "adminOption1 adminOption2");
+    List<String> javaOpts = localizer.getJavaOpts(conf);
+
+    Assert.assertEquals(3, javaOpts.size());
+    Assert.assertTrue(javaOpts.get(0).equals("adminOption1"));
+    Assert.assertTrue(javaOpts.get(1).equals("adminOption2"));
+    Assert.assertTrue(javaOpts.get(2).equals("-Xmx256m"));
+  }
+
+  @Test
+  public void testUserOptionsWhenAdminOptionsAreNotDefined() throws Exception {
+    ContainerLocalizerWrapper wrapper = new ContainerLocalizerWrapper();
+    ContainerLocalizer localizer = wrapper.setupContainerLocalizerForTest();
+
+    Configuration conf = new Configuration();
+    conf.setStrings(YarnConfiguration.NM_CONTAINER_LOCALIZER_JAVA_OPTS_KEY,
+        "userOption1 userOption2");
+    List<String> javaOpts = localizer.getJavaOpts(conf);
+
+    Assert.assertEquals(2, javaOpts.size());
+    Assert.assertTrue(javaOpts.get(0).equals("userOption1"));
+    Assert.assertTrue(javaOpts.get(1).equals("userOption2"));
+  }
+
+  @Test
+  public void testJavaOptionsWithoutDefinedAdminOrUserOptions() throws 
Exception {
+    ContainerLocalizerWrapper wrapper = new ContainerLocalizerWrapper();
+    ContainerLocalizer localizer = wrapper.setupContainerLocalizerForTest();
+
+    Configuration conf = new Configuration();
+    List<String> javaOpts = localizer.getJavaOpts(conf);
+
+    Assert.assertEquals(1, javaOpts.size());
+    Assert.assertTrue(javaOpts.get(0).equals("-Xmx256m"));
+  }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org
For additional commands, e-mail: common-commits-h...@hadoop.apache.org

Reply via email to