0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 package org.apache.spark.launcher;
0019
0020 import java.io.IOException;
0021 import java.util.ArrayList;
0022 import java.util.Arrays;
0023 import java.util.HashMap;
0024 import java.util.List;
0025 import java.util.Map;
0026
0027 import static org.apache.spark.launcher.CommandBuilderUtils.*;
0028
0029
0030
0031
0032 class Main {
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051 public static void main(String[] argsArray) throws Exception {
0052 checkArgument(argsArray.length > 0, "Not enough arguments: missing class name.");
0053
0054 List<String> args = new ArrayList<>(Arrays.asList(argsArray));
0055 String className = args.remove(0);
0056
0057 boolean printLaunchCommand = !isEmpty(System.getenv("SPARK_PRINT_LAUNCH_COMMAND"));
0058 Map<String, String> env = new HashMap<>();
0059 List<String> cmd;
0060 if (className.equals("org.apache.spark.deploy.SparkSubmit")) {
0061 try {
0062 AbstractCommandBuilder builder = new SparkSubmitCommandBuilder(args);
0063 cmd = buildCommand(builder, env, printLaunchCommand);
0064 } catch (IllegalArgumentException e) {
0065 printLaunchCommand = false;
0066 System.err.println("Error: " + e.getMessage());
0067 System.err.println();
0068
0069 MainClassOptionParser parser = new MainClassOptionParser();
0070 try {
0071 parser.parse(args);
0072 } catch (Exception ignored) {
0073
0074 }
0075
0076 List<String> help = new ArrayList<>();
0077 if (parser.className != null) {
0078 help.add(parser.CLASS);
0079 help.add(parser.className);
0080 }
0081 help.add(parser.USAGE_ERROR);
0082 AbstractCommandBuilder builder = new SparkSubmitCommandBuilder(help);
0083 cmd = buildCommand(builder, env, printLaunchCommand);
0084 }
0085 } else {
0086 AbstractCommandBuilder builder = new SparkClassCommandBuilder(className, args);
0087 cmd = buildCommand(builder, env, printLaunchCommand);
0088 }
0089
0090 if (isWindows()) {
0091 System.out.println(prepareWindowsCommand(cmd, env));
0092 } else {
0093
0094 System.out.println('\0');
0095
0096
0097 List<String> bashCmd = prepareBashCommand(cmd, env);
0098 for (String c : bashCmd) {
0099 System.out.print(c);
0100 System.out.print('\0');
0101 }
0102 }
0103 }
0104
0105
0106
0107
0108
0109 private static List<String> buildCommand(
0110 AbstractCommandBuilder builder,
0111 Map<String, String> env,
0112 boolean printLaunchCommand) throws IOException, IllegalArgumentException {
0113 List<String> cmd = builder.buildCommand(env);
0114 if (printLaunchCommand) {
0115 System.err.println("Spark Command: " + join(" ", cmd));
0116 System.err.println("========================================");
0117 }
0118 return cmd;
0119 }
0120
0121
0122
0123
0124
0125
0126
0127
0128 private static String prepareWindowsCommand(List<String> cmd, Map<String, String> childEnv) {
0129 StringBuilder cmdline = new StringBuilder();
0130 for (Map.Entry<String, String> e : childEnv.entrySet()) {
0131 cmdline.append(String.format("set %s=%s", e.getKey(), e.getValue()));
0132 cmdline.append(" && ");
0133 }
0134 for (String arg : cmd) {
0135 cmdline.append(quoteForBatchScript(arg));
0136 cmdline.append(" ");
0137 }
0138 return cmdline.toString();
0139 }
0140
0141
0142
0143
0144
0145 private static List<String> prepareBashCommand(List<String> cmd, Map<String, String> childEnv) {
0146 if (childEnv.isEmpty()) {
0147 return cmd;
0148 }
0149
0150 List<String> newCmd = new ArrayList<>();
0151 newCmd.add("env");
0152
0153 for (Map.Entry<String, String> e : childEnv.entrySet()) {
0154 newCmd.add(String.format("%s=%s", e.getKey(), e.getValue()));
0155 }
0156 newCmd.addAll(cmd);
0157 return newCmd;
0158 }
0159
0160
0161
0162
0163
0164
0165 private static class MainClassOptionParser extends SparkSubmitOptionParser {
0166
0167 String className;
0168
0169 @Override
0170 protected boolean handle(String opt, String value) {
0171 if (CLASS.equals(opt)) {
0172 className = value;
0173 }
0174 return false;
0175 }
0176
0177 @Override
0178 protected boolean handleUnknown(String opt) {
0179 return false;
0180 }
0181
0182 @Override
0183 protected void handleExtraArgs(List<String> extra) {
0184
0185 }
0186
0187 }
0188
0189 }