Prevent users from setting -Xmx parameter directly for spawned yarn processes
diff --git a/subprojects/s4-yarn/src/main/java/org/apache/s4/tools/yarn/CommonS4YarnArgs.java b/subprojects/s4-yarn/src/main/java/org/apache/s4/tools/yarn/CommonS4YarnArgs.java
index 222ac5a..9789de5 100644
--- a/subprojects/s4-yarn/src/main/java/org/apache/s4/tools/yarn/CommonS4YarnArgs.java
+++ b/subprojects/s4-yarn/src/main/java/org/apache/s4/tools/yarn/CommonS4YarnArgs.java
@@ -5,7 +5,9 @@
import org.apache.s4.core.Main.InlineConfigParameterConverter;
+import com.beust.jcommander.IParameterValidator;
import com.beust.jcommander.Parameter;
+import com.beust.jcommander.ParameterException;
public class CommonS4YarnArgs {
@@ -53,8 +55,18 @@
List<String> extraNamedParameters = new ArrayList<String>();
// TODO parse JVM parameters that include commas
- @Parameter(names = S4CLIYarnArgs.S4_NODE_JVM_PARAMETERS, description = "Extra JVM parameter for running the nodes, specified as a comma separated list. The memory is usually configured through "
- + S4_NODE_MEMORY, required = false)
+ @Parameter(names = S4_NODE_JVM_PARAMETERS, description = "Extra JVM parameter for running the nodes, specified as a comma separated list. The memory parameter -Xmx must be configured through "
+ + S4_NODE_MEMORY, required = false, validateWith = NodeJVMParametersValidator.class)
List<String> extraS4NodeJVMParams = new ArrayList<String>();
+ public static class NodeJVMParametersValidator implements IParameterValidator {
+
+ @Override
+ public void validate(String name, String value) throws ParameterException {
+ if (value.matches(".*-Xmx\\d+.*")) {
+ throw new ParameterException("-Xmx JVM parameter cannot be specified here. You must use the "
+ + S4_NODE_MEMORY + " parameter instead.");
+ }
+ }
+ }
}
diff --git a/subprojects/s4-yarn/src/main/java/org/apache/s4/tools/yarn/S4ApplicationMaster.java b/subprojects/s4-yarn/src/main/java/org/apache/s4/tools/yarn/S4ApplicationMaster.java
index d7dc788..f1efb35 100644
--- a/subprojects/s4-yarn/src/main/java/org/apache/s4/tools/yarn/S4ApplicationMaster.java
+++ b/subprojects/s4-yarn/src/main/java/org/apache/s4/tools/yarn/S4ApplicationMaster.java
@@ -99,34 +99,34 @@
// For status update for clients - yet to be implemented
// Hostname of the container
- private String appMasterHostname = "";
+ private final String appMasterHostname = "";
// Port on which the app master listens for status update requests from clients
- private int appMasterRpcPort = 0;
+ private final int appMasterRpcPort = 0;
// Tracking url to which app master publishes info for clients to monitor
- private String appMasterTrackingUrl = "";
+ private final String appMasterTrackingUrl = "";
// Incremental counter for rpc calls to the RM
- private AtomicInteger rmRequestID = new AtomicInteger();
+ private final AtomicInteger rmRequestID = new AtomicInteger();
// Simple flag to denote whether all works is done
private boolean appDone = false;
// Counter for completed containers ( complete denotes successful or failed )
- private AtomicInteger numCompletedContainers = new AtomicInteger();
+ private final AtomicInteger numCompletedContainers = new AtomicInteger();
// Allocated container count so that we know how many containers has the RM
// allocated to us
- private AtomicInteger numAllocatedContainers = new AtomicInteger();
+ private final AtomicInteger numAllocatedContainers = new AtomicInteger();
// Count of failed containers
- private AtomicInteger numFailedContainers = new AtomicInteger();
+ private final AtomicInteger numFailedContainers = new AtomicInteger();
// Count of containers already requested from the RM
// Needed as once requested, we should not request for containers again and again.
// Only request for more if the original requirement changes.
- private AtomicInteger numRequestedContainers = new AtomicInteger();
+ private final AtomicInteger numRequestedContainers = new AtomicInteger();
// Containers to be released
- private CopyOnWriteArrayList<ContainerId> releasedContainers = new CopyOnWriteArrayList<ContainerId>();
+ private final CopyOnWriteArrayList<ContainerId> releasedContainers = new CopyOnWriteArrayList<ContainerId>();
// Launch threads
- private List<Thread> launchThreads = new ArrayList<Thread>();
+ private final List<Thread> launchThreads = new ArrayList<Thread>();
private int containerMemory;
@@ -144,8 +144,6 @@
Tools.parseArgs(yarnArgs, args);
- Thread.sleep(10000);
-
S4ApplicationMaster appMaster = new S4ApplicationMaster();
logger.info("Initializing ApplicationMaster with args " + Arrays.toString(args));
appMaster.init();
@@ -499,9 +497,6 @@
S4YarnClient.addListElementsToCommandLineBuffer(vargs, null, " ", yarnArgs.extraS4NodeJVMParams);
- if (!yarnArgs.extraS4NodeJVMParams.isEmpty()) {
- vargs.add(CommonS4YarnArgs.S4_NODE_JVM_PARAMETERS);
- }
// TODO add memory parameter
// vargs.add("-Xdebug");
// vargs.add("-Xrunjdwp:transport=dt_socket,address=8889,server=y");
diff --git a/subprojects/s4-yarn/src/main/java/org/apache/s4/tools/yarn/S4YarnClient.java b/subprojects/s4-yarn/src/main/java/org/apache/s4/tools/yarn/S4YarnClient.java
index a4b5a12..77c120c 100644
--- a/subprojects/s4-yarn/src/main/java/org/apache/s4/tools/yarn/S4YarnClient.java
+++ b/subprojects/s4-yarn/src/main/java/org/apache/s4/tools/yarn/S4YarnClient.java
@@ -120,7 +120,7 @@
private static Logger logger = LoggerFactory.getLogger(S4YarnClient.class);
// Configuration
- private Configuration conf;
+ private final Configuration conf;
S4CLIYarnArgs yarnArgs;
@@ -325,8 +325,10 @@
vargs.add(CommonS4YarnArgs.NB_S4_NODES + " " + String.valueOf(yarnArgs.numContainers));
vargs.add(CommonS4YarnArgs.PRIORITY + " " + String.valueOf(yarnArgs.priority));
- addListElementsToCommandLineBuffer(vargs, CommonS4YarnArgs.S4_NODE_JVM_PARAMETERS, ",", yarnArgs.extraS4NodeJVMParams);
- addListElementsToCommandLineBuffer(vargs, CommonS4YarnArgs.EXTRA_MODULES_CLASSES, ",", yarnArgs.extraModulesClasses);
+ addListElementsToCommandLineBuffer(vargs, CommonS4YarnArgs.S4_NODE_JVM_PARAMETERS, ",",
+ yarnArgs.extraS4NodeJVMParams);
+ addListElementsToCommandLineBuffer(vargs, CommonS4YarnArgs.EXTRA_MODULES_CLASSES, ",",
+ yarnArgs.extraModulesClasses);
addListElementsToCommandLineBuffer(vargs, "-namedStringParameters", ",", yarnArgs.extraNamedParameters);
vargs.add("-c " + String.valueOf(yarnArgs.cluster));