spark主流程源码分析

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

该命令主要调用相应脚本下着 这个主类
spark主流程源码分析_第1张图片
然后再源码的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依次提交其下下的多个任务)
spark主流程源码分析_第2张图片

3、sparkcontext 中初始化环境步骤(这里面是任务运行调度的全部 ) 欢迎留下不同意见

new sparkcontext ()会调用sparkcontext 的主构造器。
(1)首先主构造器中会创建单例ActorSystom 主要作用是为后期集群master 和work excuter 等之间通讯都要通过他
spark主流程源码分析_第3张图片

(2)、创建TaskScheduler ,其中包含了根据不同的spark 调度模式(yarn、local、standAlone )创建调度器。(fifo 和公平调度器等)

(3)、创建DAG调度器,器主要根据任务映射的有向无环图做stage 阶段的划分。(todo 下面源码继续)

(4)、taskScheduler.start : 任务调度器开始,其实现的功能 通过第一步的ActorSystem 创建 driveActor 和AppClient 然后实现 Appcient段和master work 服务器节点通讯和excuter work 和 drive之间进行通讯等。然后通过

spark主流程源码分析_第4张图片

通过
spark主流程源码分析_第5张图片

向master 发送注册消息 此时 需要跳的 master.scla 类的 RegisterApplication 方法内容如下
spark主流程源码分析_第6张图片
其中他做的几件事主要是:

1、首先把应用的信息放到内存中存储
2、master 向 clintActor发送注册成功的消息
3、Master开始调度资源(其实就是把任务启动到哪些Worker上)

其中 schedule 方法中 具体给出了任务分配到资源的方式,Master发送消息给Worker,把参数通过case class传递给Worker,让他启动Executor,

spark主流程源码分析_第7张图片

通过如下方法进行excuter的构建 然后进入ExecutorRunner的主构造器start 方法启动子线程启动excutor的线程,然后并完成对driver的注册,并启动线程池(默认为newDaemonCachedThreadPool)

注意:启动线程池的作用是等待任务划分完后将任务扔入到线程池中
spark主流程源码分析_第8张图片
spark主流程源码分析_第9张图片

你可能感兴趣的:(大数据,spark)