1、spark 任务提交过程首先调用sprark-submit函数
例子为 :
bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://node-1.itcast.cn:7077 --executor-memory 2g --total-executor-cores 4
该命令主要调用相应脚本下着 这个主类
然后再源码的bin 中调用命令
exec “
R
U
N
N
E
R
"
−
c
p
"
RUNNER" -cp "
RUNNER"−cp"CLASSPATH”
J
A
V
A
O
P
T
S
"
JAVA_OPTS "
JAVAOPTS"@"
启动源码中的 org.apache.spark.deploy.SparkSubmit 类中 -》submit -》 doRunMain (args class cn.itcast.spark.WordCount …)
通过反射的方式启动 启动传给程序的主类然后启动( Class.forName通过反射调用自定义类的main方法 org.apache.spark.examples.SparkPi 程序)
2、程序进入主程序后 此时进入主程序代码
(1)sparkcontext 初始化运行所需的所有环境(环境初始化、任务资源调度等)
(2)然后就是下面代码分(最后会被切成不同stage 不同stage依次提交其下下的多个任务)
3、sparkcontext 中初始化环境步骤(这里面是任务运行调度的全部 ) 欢迎留下不同意见
new sparkcontext ()会调用sparkcontext 的主构造器。
(1)首先主构造器中会创建单例ActorSystom 主要作用是为后期集群master 和work excuter 等之间通讯都要通过他
(2)、创建TaskScheduler ,其中包含了根据不同的spark 调度模式(yarn、local、standAlone )创建调度器。(fifo 和公平调度器等)
(3)、创建DAG调度器,器主要根据任务映射的有向无环图做stage 阶段的划分。(todo 下面源码继续)
(4)、taskScheduler.start : 任务调度器开始,其实现的功能 通过第一步的ActorSystem 创建 driveActor 和AppClient 然后实现 Appcient段和master work 服务器节点通讯和excuter work 和 drive之间进行通讯等。然后通过
通过
向master 发送注册消息 此时 需要跳的 master.scla 类的 RegisterApplication 方法内容如下
其中他做的几件事主要是:
1、首先把应用的信息放到内存中存储
2、master 向 clintActor发送注册成功的消息
3、Master开始调度资源(其实就是把任务启动到哪些Worker上)
其中 schedule 方法中 具体给出了任务分配到资源的方式,Master发送消息给Worker,把参数通过case class传递给Worker,让他启动Executor,
通过如下方法进行excuter的构建 然后进入ExecutorRunner的主构造器start 方法启动子线程启动excutor的线程,然后并完成对driver的注册,并启动线程池(默认为newDaemonCachedThreadPool)
注意:启动线程池的作用是等待任务划分完后将任务扔入到线程池中