spark主流程源码分析

 ̄綄美尐妖づ 提交于 2019-12-11 18:55:13

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 “RUNNER"cp"RUNNER" -cp "CLASSPATH” JAVAOPTS"JAVA_OPTS "@"

启动源码中的 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)

注意:启动线程池的作用是等待任务划分完后将任务扔入到线程池中
在这里插入图片描述
在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!