美文网首页Spark深入学习Spark-core源码精读spark
Spark-Core源码精读(4)、对Main类的补充说明

Spark-Core源码精读(4)、对Main类的补充说明

作者: sun4lower | 来源:发表于2017-03-06 10:38 被阅读339次

    上一篇博客中提到了org.apache.spark.launcher.Main这个类,用来生成供spark-class中exec执行的具体的command,本文我们就来具体看一下这个类的实现机制。

    首先使用一张图来概括一下Main的实现原理和机制,然后再进行详细说明,俗话说“有图有真相!”

    下面我们对这张图进行说明:

    1、首先在spark-class中通过Main [class] [classArgs]的方式将SparkSubmit或者Master、Worker以参数的方式传入

    2、Main中的main方法获取到spark-class传过来的className,判断是否为SparkSubmit

    3、如果是SparkSubmit就通过实例化SparkSubmitCommandBuilder并调用buildCommand方法来创建供spark-class中exec执行的command

    4、如果是其他的类(例如Master或者Worker等)就会实例化SparkClassCommandBuilder并调用buildCommand方法来创建供spark-class中exec执行的command

    5、3和4生成的command最终都会交给spark-class中的exec来执行,生成具体的进程:根据3生成的command创建的就是SparkSubmit进程,用来提交应用程序;根据4生成的command创建的就是Master、Worker等进程。

    下面是Main类的main()方法,供大家参考:

    public static void main(String[] argsArray) throws Exception {
      checkArgument(argsArray.length > 0, "Not enough arguments: missing class name.");
      List<String> args = new ArrayList<String>(Arrays.asList(argsArray));
      String className = args.remove(0);
      boolean printLaunchCommand = !isEmpty(System.getenv("SPARK_PRINT_LAUNCH_COMMAND"));
      AbstractCommandBuilder builder;
      if (className.equals("org.apache.spark.deploy.SparkSubmit")) {
        try {
          builder = new SparkSubmitCommandBuilder(args);
        } catch (IllegalArgumentException e) {
          printLaunchCommand = false;
          System.err.println("Error: " + e.getMessage());
          System.err.println();
          MainClassOptionParser parser = new MainClassOptionParser();
          try {
            parser.parse(args);
          } catch (Exception ignored) {
            // Ignore parsing exceptions.
          }
          List<String> help = new ArrayList<String>();
          if (parser.className != null) {
            help.add(parser.CLASS);
            help.add(parser.className);
          }
          help.add(parser.USAGE_ERROR);
          builder = new SparkSubmitCommandBuilder(help);
        }
      } else {
        builder = new SparkClassCommandBuilder(className, args);
      }
      Map<String, String> env = new HashMap<String, String>();
      List<String> cmd = builder.buildCommand(env);
      if (printLaunchCommand) {
        System.err.println("Spark Command: " + join(" ", cmd));
        System.err.println("========================================");
      }
      if (isWindows()) {
        System.out.println(prepareWindowsCommand(cmd, env));
      } else {
        // In bash, use NULL as the arg separator since it cannot be used in an argument.
        List<String> bashCmd = prepareBashCommand(cmd, env);
        for (String c : bashCmd) {
          System.out.print(c);
          System.out.print('\0');
        }
      }
    }
    

    有兴趣的朋友可以深入研究一下command构造的内部机制,本文只是上一篇博客的补充,避免大家对Main的内部工作机制产生疑惑。

    接下来的文章我们将对Spark的内核架构进行分析。

    本文为原创,欢迎转载,转载请注明出处、作者,谢谢!

    相关文章

      网友评论

        本文标题:Spark-Core源码精读(4)、对Main类的补充说明

        本文链接:https://www.haomeiwen.com/subject/gpbygttx.html