发布网友 发布时间:16小时前
共1个回答
热心网友 时间:14小时前
使用spark-submit提交Spark应用,其核心在于启动Java虚拟机(JVM)执行指定的主类。spark-submit作为启动脚本,其关键在于运行spark-class文件,并接收用户提供的参数。
此脚本执行后,生成的命令流程如图所示,通过构建Java命令来启动JVM。
脚本中的关键代码负责构建用于运行JVM的命令,通过将所有传入参数直接传递给下一个命令实现。
构建Java命令的过程通过Spark中的`org.apache.spark.launcher.Main`类实现。此类实例化`SparkSubmitCommandBuilder`对象,接收参数用于确定要执行的脚本类型,并通过`parse`方法将参数转换为键值对形式,赋值给`AbstractCommandBuilder`类的成员变量,包括`master`、`deployer`等。
`Main`类的主要方法中同样使用`parser.parse`进行参数匹配和转换。进一步分析,关键步骤在于`buildCommand`方法的实现。此方法首先判断是否为`appResource`(运行的jar为`pyshell`或`sparkshell`),如果不是,则调用`buildSparkSubmitCommand`构建命令。
`buildSparkSubmitCommand`方法构造Java命令,使用`buildJavaCommand`方法构建`java -p XX`形式的命令,其中`XX`为参数,但不包含运行主类和参数。主类及参数通过`cmd.addAll`方法加入,`buildSparkSubmitArgs`方法用于将`AbstractCommandBuilder`的成员变量拼接为命令参数。
至此,spark-submit的命令构建完成,最终执行`spark-core`启动过程。