Spark提交任务流程(调用Spark-submit脚本)
Spark提交任务常用参数
上一篇介绍了Spark集群启动流程的源码的分析,集群启动后,接下来就是提交任务运行了。这篇将结合源码对Spark任务提交流程以及任务运行流程进行分析。
Spark提交任务,是通过调用spark-submit脚本来进行任务提交的,同时在任务提交的时候还可以指定一些参数,如设置本地模式、集群模式、指定每个executor大小或者所有executor总共的运行的核的数量等。关于Spark任务提交的常用参数和参数的相关说明如下表格。
|
|
---|---|
- -master | master 的地址,提交任务到哪里执行, 有三种模式,集群模式:spark://host:port,yarn模式: yarn, 本地模式: local[2]可指定线程数 |
- -executor-memory | 每个 executor 的内存,默认是1G,可以自己指定 |
- -total-executor-cores | 所有 executor 总共的核数。仅仅在 mesos 或者 standalone 下使用 |
- -num-executors | 启动的 executor 数量。默认为2。在 yarn 下使用 |
- -executor-core | 每个 executor 的核数。在yarn或者standalone下使用 |
- -class | 应用程序的主类,仅针对 java 或 scala 应用 |
- -name | 应用程序的名称 |
- -jars | 用逗号分隔的本地 jar 包,设置后,这些 jar 将包含在 driver 和 executor 的 classpath 下 |
–driver-class-path | 传给 driver 的额外的类路径 |
- -exclude-packages | 为了避免冲突 而指定不包含的 package |
Spark提交任务总流程
在上一步我们已经说了提交任务涉及到的一些具体参数和参数的说明。那么在提交任务之后任务究竟是怎么执行呢?接下来我们就来看看任务提交的基本流程,任务提交的流程如下图。
流程描述
1、Driver端向Master提交注册任务。
2、Master接收到Driver发送过来的信息后,把信息封装成真正的任务信息,并把任务信息进行保存。
3、Master通知Worker拿取任务信息,同时通知Worker启动Executor。
4、Worker向Master拿取任务,同时启动Executor。
5、Executor开始向Driver进行反向注册。
6、Driver端开始发送任务。
任务运行流程
运行spark-submit脚本时实际上是调用了SparkSubmit类中的方法,通过SparkSubmit中的方法来实现任务的运行。
1.调用SparkSubmit中的main方法。
2.接收任务参数,将参数封装到SparkSubmitArguments中。
3.遍历封装在SparkSubmitArguments中的参数,与SparkSubmitAction(枚举类)中的参数进行匹配,如果匹配到是SparkSubmitAction.SUBMIT,调用submit(appArgs)方法进行提交;如果匹配到的参数是SparkSubmitAction.KILL,就调用kill(appArgs);如果是SparkSubmitAction.REQUEST_STATUS,就调用requestStatus(appArgs)获得请求状态。
以匹配到submit为例
3.1 拿到远程代理对象。(通过代理对象可以找到运行的主类)
3.2 调用run方法,通过拿到的代理对象,再调用run方法里的runMain方法找到要执行的类的main方法。
runMain
1)通过类的反射拿到入口类。
2)通过getMethod拿到要执行的类的main方法。
3)再通过invoke方法,开始执行任务重的程序的main方法。
至此,提交的要被执行类就正常被执行了,这就是任务运行运行的整个流程。
第一篇:Spark源码分析(一)—Spark集群启动流程