ITPub博客

首页 > 大数据 > > Spark-Submit 源码剖析

Spark-Submit 源码剖析

作者:格伯纳 时间:2020-05-12 12:04:29 0 删除 编辑

直奔主题吧:

常规Spark提交任务脚本如下:

其中几个关键的参数:

--class
--properties
--driver-java-options
--jars
--files
jar包

再看下cluster.conf配置参数,如下:

spark.local.dir
spark.master
spark.num.executors
spark.executor.memory
spark.executor.cores
spark.port.maxRetries
spark.default.parallelism
spark.driver.memory

spark-submit提交一个job到spark集群中,大致的经历三个过程:

  1. Driver中SparkSession环境预准备
  2. yarn/mesos申请资源(申请executor)
  3. Driver得到executor之后开始生成task任务,并执行

代码总Main入口如下:

Main支持两种模式CLI:SparkSubmit;SparkClass

首先是checkArgument做参数校验

而sparksubmit则是通过buildCommand来创建

buildCommand核心是AbstractCommandBuilder类

继续往下剥洋葱AbstractCommandBuilder如下:

定义Spark命令创建的方法一个抽象类,SparkSubmitCommandBuilder刚好是实现类如下

SparkSubmit种类可以分为以上6种。SparkSubmitCommandBuilder有两个构造方法有参数和无参数:

有参数中根据参数传入拆分三种方式,然后通过OptionParser解析Args,构造参数创建对象后核心方法是通过buildCommand,而buildCommand又是通过buildSparkSubmitCommand来生成具体提交。

buildSparkSubmitCommand会返回List<String>的命令集合,分为两个部分去创建此List,

第一个如下加入Driver_memory参数

第二个是通过buildSparkSubmitArgs方法构建的具体参数是MASTER,DEPLOY_MODE,FILES,CLASS等等,这些就和我们上面截图中是对应上的。是通过OptionParser方式获取到。

那么到这里的话buildCommand就生成了一个完成sparksubmit参数的命令List<String>

而生成命令之后执行的任务开启点在org.apache.spark.deploy.SparkSubmit.scala

继续往下剥洋葱SparkSubmit.scala代码入口如下:

SparkSubmit,kill,request都支持,后两个方法知识支持standalone和Mesos集群方式下。dosubmit作为函数入口,其中第一步是初始化LOG,然后初始化解析参数涉及到类

SparkSubmitArguments作为参数初始化类,继承SparkSubmitArgumentsParser类

其中env是测试用的,参数解析如下,parse方法继承了SparkSubmitArgumentsParser解析函数查找 args 中设置的--选项和值并解析为 name 和 value ,如 --master yarn-client 会被解析为值为 --master 的 name 和值为 yarn-client 的 value 。

这之后调用SparkSubmitArguments#handle(MASTER, "yarn-client")进行处理。

这个函数也很简单,根据参数 opt 及 value,设置各个成员的值。接上例,parse 中调用 handle("--master", "yarn-client")后,在 handle 函数中,master 成员将被赋值为 yarn-client。

回到SparkSubmit.scala通过SparkSubmitArguments生成了args,然后调用action来匹配动作是submit,kill,request_status,print_version。

直接看submit的action,doRunMain执行入口

其中prepareSubmitEnvironment初始化环境变量该方法返回一个四元 Tuple ,分别表示子进程参数、子进程 classpath 列表、系统属性 map 、子进程 main 方法。完成了提交环境的准备工作之后,接下来就将启动子进程。

runMain则是执行入口,入参则是执行参数SparkSubmitArguments

Main执行非常的简单:几个核心步骤

先是打印一串日志(可忽略),然后是创建了loader是把依赖包jar全部导入到项目中

然后是MainClass的生成,异常处理是ClassNotFoundException和NoClassDeffoundError

再者是生成Application,根据MainClass生成APP,最后调用start执行

具体执行是SparkApplication.scala,那么继续往下剥~

仔细阅读下SparkApplication还是挺深的,所以打算另外写篇继续深入研读~

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31509949/viewspace-3168158/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
管理员

注册时间:2018-03-30

  • 博文量
    2383
  • 访问量
    984439