diff --git a/bin/spark-class b/bin/spark-class index 65d3b9612909a..c1461a7712289 100755 --- a/bin/spark-class +++ b/bin/spark-class @@ -68,15 +68,27 @@ fi # The exit code of the launcher is appended to the output, so the parent shell removes it from the # command array and checks the value to see if the launcher succeeded. build_command() { - "$RUNNER" -Xmx128m -cp "$LAUNCH_CLASSPATH" org.apache.spark.launcher.Main "$@" + "$RUNNER" -Xmx128m $SPARK_LAUNCHER_OPTS -cp "$LAUNCH_CLASSPATH" org.apache.spark.launcher.Main "$@" printf "%d\0" $? } # Turn off posix mode since it does not allow process substitution set +o posix CMD=() -while IFS= read -d '' -r ARG; do - CMD+=("$ARG") +DELIM=$'\n' +CMD_START_FLAG="false" +while IFS= read -d "$DELIM" -r ARG; do + if [ "$CMD_START_FLAG" == "true" ]; then + CMD+=("$ARG") + else + if [ "$ARG" == $'\0' ]; then + # After NULL character is consumed, change the delimiter and consume command string. + DELIM='' + CMD_START_FLAG="true" + elif [ "$ARG" != "" ]; then + echo "$ARG" + fi + fi done < <(build_command "$@") COUNT=${#CMD[@]} diff --git a/conf/spark-env.sh.template b/conf/spark-env.sh.template index bc92c78f0f8f3..df39ad8b0dcc2 100755 --- a/conf/spark-env.sh.template +++ b/conf/spark-env.sh.template @@ -56,6 +56,9 @@ # - SPARK_DAEMON_CLASSPATH, to set the classpath for all daemons # - SPARK_PUBLIC_DNS, to set the public dns name of the master or workers +# Options for launcher +# - SPARK_LAUNCHER_OPTS, to set config properties and Java options for the launcher (e.g. "-Dx=y") + # Generic options for the daemons used in the standalone deploy mode # - SPARK_CONF_DIR Alternate conf dir. (Default: ${SPARK_HOME}/conf) # - SPARK_LOG_DIR Where log files are stored. (Default: ${SPARK_HOME}/logs) diff --git a/launcher/src/main/java/org/apache/spark/launcher/Main.java b/launcher/src/main/java/org/apache/spark/launcher/Main.java index d967aa39a4827..e1054c7060f12 100644 --- a/launcher/src/main/java/org/apache/spark/launcher/Main.java +++ b/launcher/src/main/java/org/apache/spark/launcher/Main.java @@ -90,6 +90,9 @@ public static void main(String[] argsArray) throws Exception { if (isWindows()) { System.out.println(prepareWindowsCommand(cmd, env)); } else { + // A sequence of NULL character and newline separates command-strings and others. + System.out.println('\0'); + // In bash, use NULL as the arg separator since it cannot be used in an argument. List bashCmd = prepareBashCommand(cmd, env); for (String c : bashCmd) {