Skip to content

Commit 85b3ea6

Browse files
authored
MAPREDUCE-7449: Add add-opens flag to container launch commands on JDK17 nodes (#5935)
1 parent b6edcb9 commit 85b3ea6

File tree

9 files changed

+61
-5
lines changed
  • hadoop-mapreduce-project/hadoop-mapreduce-client
  • hadoop-yarn-project/hadoop-yarn
    • hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api
    • hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/src/main/java/org/apache/hadoop/yarn/applications/distributedshell
    • hadoop-yarn-server/hadoop-yarn-server-nodemanager/src

9 files changed

+61
-5
lines changed

hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/job/impl/TestMapReduceChildJVM.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public void testCommandLine() throws Exception {
5252
MyMRApp app = new MyMRApp(1, 0, true, this.getClass().getName(), true);
5353
Configuration conf = new Configuration();
5454
conf.setBoolean(MRConfig.MAPREDUCE_APP_SUBMISSION_CROSS_PLATFORM, true);
55+
conf.setBoolean(MRJobConfig.MAPREDUCE_JVM_ADD_OPENS_JAVA_OPT, false);
5556
Job job = app.submit(conf);
5657
app.waitForState(job, JobState.SUCCEEDED);
5758
app.verifyCompleted();
@@ -123,7 +124,7 @@ private void testReduceCommandLine(Configuration conf)
123124
"[" + MRApps.crossPlatformify("JAVA_HOME") + "/bin/java" +
124125
" -Djava.net.preferIPv4Stack=true" +
125126
" -Dhadoop.metrics.log.level=WARN " +
126-
" -Xmx820m -Djava.io.tmpdir=" + MRApps.crossPlatformify("PWD") + "/tmp" +
127+
" -Xmx820m <ADD_OPENS> -Djava.io.tmpdir=" + MRApps.crossPlatformify("PWD") + "/tmp" +
127128
" -Dlog4j.configuration=container-log4j.properties" +
128129
" -Dyarn.app.container.log.dir=<LOG_DIR>" +
129130
" -Dyarn.app.container.log.filesize=0" +
@@ -165,7 +166,7 @@ public void testCommandLineWithLog4JConifg() throws Exception {
165166
"[" + MRApps.crossPlatformify("JAVA_HOME") + "/bin/java" +
166167
" -Djava.net.preferIPv4Stack=true" +
167168
" -Dhadoop.metrics.log.level=WARN " +
168-
" -Xmx820m -Djava.io.tmpdir=" + MRApps.crossPlatformify("PWD") + "/tmp" +
169+
" -Xmx820m <ADD_OPENS> -Djava.io.tmpdir=" + MRApps.crossPlatformify("PWD") + "/tmp" +
169170
" -Dlog4j.configuration=" + testLogPropertieFile +
170171
" -Dyarn.app.container.log.dir=<LOG_DIR>" +
171172
" -Dyarn.app.container.log.filesize=0" +

hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/JobConf.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import org.apache.hadoop.util.ClassUtil;
5252
import org.apache.hadoop.util.ReflectionUtils;
5353
import org.apache.hadoop.util.Tool;
54+
import org.apache.hadoop.yarn.api.ApplicationConstants;
5455
import org.slf4j.Logger;
5556
import org.slf4j.LoggerFactory;
5657

@@ -2207,6 +2208,13 @@ public String getTaskJavaOpts(TaskType taskType) {
22072208
javaOpts += " " + xmxArg;
22082209
}
22092210

2211+
// JDK17 support: automatically add --add-opens=java.base/java.lang=ALL-UNNAMED
2212+
// so the tasks can launch on a JDK17 node.
2213+
if (getBoolean(MRJobConfig.MAPREDUCE_JVM_ADD_OPENS_JAVA_OPT,
2214+
MRJobConfig.MAPREDUCE_JVM_ADD_OPENS_JAVA_OPT_DEFAULT)) {
2215+
javaOpts += " " + ApplicationConstants.JVM_ADD_OPENS_VAR;
2216+
}
2217+
22102218
return javaOpts;
22112219
}
22122220

hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapreduce/MRJobConfig.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,15 @@ public interface MRJobConfig {
305305
"os.name,os.version,java.home,java.runtime.version,java.vendor," +
306306
"java.version,java.vm.name,java.class.path,java.io.tmpdir,user.dir,user.name";
307307

308+
/*
309+
* Flag to indicate whether JDK17's required add-opens flags should be added to MR AM and
310+
* map/reduce containers regardless of the user specified java opts.
311+
*/
312+
public static final String MAPREDUCE_JVM_ADD_OPENS_JAVA_OPT =
313+
"mapreduce.jvm.add-opens-as-default";
314+
315+
public static final boolean MAPREDUCE_JVM_ADD_OPENS_JAVA_OPT_DEFAULT = true;
316+
308317
public static final String IO_SORT_FACTOR = "mapreduce.task.io.sort.factor";
309318

310319
public static final int DEFAULT_IO_SORT_FACTOR = 10;

hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/resources/mapred-default.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1804,6 +1804,18 @@
18041804
<description>Comma-delimited list of system properties to log on mapreduce JVM start</description>
18051805
</property>
18061806

1807+
<property>
1808+
<name>mapreduce.jvm.add-opens-as-default</name>
1809+
<value>true</value>
1810+
<description>Since on JDK17 it's no longer possible to use the reflection API to
1811+
access non-public fields and methods add-opens flags should be added to MR AM
1812+
and map/reduce containers regardless of the user specified java opts. Setting
1813+
this to true will add the flags to the container launch commands on nodes with
1814+
JDK17 or higher. Defaults to true, but the setting has no effect on nodes using
1815+
JDK16 and before.
1816+
</description>
1817+
</property>
1818+
18071819
<!-- jobhistory properties -->
18081820

18091821
<property>

hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/main/java/org/apache/hadoop/mapred/YARNRunner.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,13 @@ private List<String> setupAMCommand(Configuration jobConf) {
485485
MRJobConfig.MR_AM_COMMAND_OPTS, MRJobConfig.MR_AM_ENV);
486486
vargs.add(mrAppMasterUserOptions);
487487

488+
// JDK17 support: automatically add --add-opens=java.base/java.lang=ALL-UNNAMED
489+
// so the tasks can launch on a JDK17 node.
490+
if (conf.getBoolean(MRJobConfig.MAPREDUCE_JVM_ADD_OPENS_JAVA_OPT,
491+
MRJobConfig.MAPREDUCE_JVM_ADD_OPENS_JAVA_OPT_DEFAULT)) {
492+
vargs.add(ApplicationConstants.JVM_ADD_OPENS_VAR);
493+
}
494+
488495
if (jobConf.getBoolean(MRJobConfig.MR_AM_PROFILE,
489496
MRJobConfig.DEFAULT_MR_AM_PROFILE)) {
490497
final String profileParams = jobConf.get(MRJobConfig.MR_AM_PROFILE_PARAMS,

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationConstants.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,13 @@ public interface ApplicationConstants {
7777
String APPLICATION_WEB_PROXY_BASE_ENV =
7878
"APPLICATION_WEB_PROXY_BASE";
7979

80+
/**
81+
* The environmental variable for JDK17's add-opens workaround. This
82+
* should be replaced either a correctly formatted add-opens option if JDK17 is used
83+
* or an empty string if not on container launch.
84+
*/
85+
String JVM_ADD_OPENS_VAR = "<ADD_OPENS>";
86+
8087
/**
8188
* The temporary environmental variable for container log directory. This
8289
* should be replaced by real container log directory on container launch.

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/src/main/java/org/apache/hadoop/yarn/applications/distributedshell/Client.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -952,6 +952,8 @@ public boolean run() throws IOException, YarnException {
952952
vargs.add("\"" + Environment.JAVA_HOME.$$() + "/bin/java\"");
953953
// Set Xmx based on am memory size
954954
vargs.add("-Xmx" + amMemory + "m");
955+
// JDK17 support
956+
vargs.add(ApplicationConstants.JVM_ADD_OPENS_VAR);
955957
// Set class name
956958
vargs.add(appMasterMainClass);
957959
// Set params for Application Master

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,13 @@ public static String expandEnvironment(String var,
170170
var = var.replace(ApplicationConstants.CLASS_PATH_SEPARATOR,
171171
File.pathSeparator);
172172

173+
if (Shell.isJavaVersionAtLeast(17)) {
174+
var = var.replace(ApplicationConstants.JVM_ADD_OPENS_VAR,
175+
"--add-opens=java.base/java.lang=ALL-UNNAMED");
176+
} else {
177+
var = var.replace(ApplicationConstants.JVM_ADD_OPENS_VAR, "");
178+
}
179+
173180
// replace parameter expansion marker. e.g. {{VAR}} on Windows is replaced
174181
// as %VAR% and on Linux replaced as "$VAR"
175182
if (Shell.WINDOWS) {

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/TestContainerLaunch.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -575,18 +575,21 @@ public void testEnvExpansion() throws IOException {
575575
+ Apps.crossPlatformify("HADOOP_HOME") + "/share/hadoop/common/lib/*"
576576
+ ApplicationConstants.CLASS_PATH_SEPARATOR
577577
+ Apps.crossPlatformify("HADOOP_LOG_HOME")
578-
+ ApplicationConstants.LOG_DIR_EXPANSION_VAR;
578+
+ ApplicationConstants.LOG_DIR_EXPANSION_VAR
579+
+ " " + ApplicationConstants.JVM_ADD_OPENS_VAR;
579580

580581
String res = ContainerLaunch.expandEnvironment(input, logPath);
581582

583+
String expectedAddOpens = Shell.isJavaVersionAtLeast(17) ?
584+
"--add-opens=java.base/java.lang=ALL-UNNAMED" : "";
582585
if (Shell.WINDOWS) {
583586
Assert.assertEquals("%HADOOP_HOME%/share/hadoop/common/*;"
584587
+ "%HADOOP_HOME%/share/hadoop/common/lib/*;"
585-
+ "%HADOOP_LOG_HOME%/nm/container/logs", res);
588+
+ "%HADOOP_LOG_HOME%/nm/container/logs" + " " + expectedAddOpens, res);
586589
} else {
587590
Assert.assertEquals("$HADOOP_HOME/share/hadoop/common/*:"
588591
+ "$HADOOP_HOME/share/hadoop/common/lib/*:"
589-
+ "$HADOOP_LOG_HOME/nm/container/logs", res);
592+
+ "$HADOOP_LOG_HOME/nm/container/logs" + " " + expectedAddOpens, res);
590593
}
591594
System.out.println(res);
592595
}

0 commit comments

Comments
 (0)