一:SparkContext原理
千言万语不抵一张图啊!(看不懂也别急,把下面的源码看完后再回过来看这张图你就懂了)web
1-1apache
二:SparkContext源码剖析
SparkContext最重要的功能就是建立了TaskScheduler、DAGSchedule和SparkUI(4040),可是咱们这篇文章主要剖析TaskScheduler的源码(重要!),其他两个暂不作详解。服务器
废话很少说,源码入口为:spark-1.3.0\core\src\main\scala\org\apache\spark\SparkContext.scalaapp
2-1spa
这里能够看到SparkContext先建立TaskScheduler,接着建立DAGSchedule,最后调用TaskScheduler的start方法启动。
TaskScheduler初始化
- 首先调用createTaskScheduler方法,该方法会根据应用程序的提交模式提供不一样的初始化程序(咱们这里分析standalone模式),首先建立TaskSchedulerImpl(就是咱们所说的TaskScheduler,底层主要基于SparkDeploySchedulerBackend来工做)和SparkDeploySchedulerBackend(
在底层接收TaskSchedulerImpl的控制,实际上负责与Master的注册、Executor的反注册,task发送到Executor等操做
)。
图2-1中的createTaskScheduler方法
2-2线程
TaskSchedulerImpl的官方简介
2-3scala
- 接着图2-2中TaskSchedulerImpl执行其init方法,建立SchedulePool调度池,它有不一样的优先策略(好比FIFO)。
2-4code
- 而后返回图2-1中TaskSchedulerImpl调用其start方法,该start方法中会调用SparkDeploySchedulerBackend的start方法。
2-5对象
2-6资源
- 在SparkDeploySchedulerBackend的start方法中,会建立AppClient对象,该对象的start方法又会启动ClientActor线程,该线程会去调用一系列方法registerWithMaster() -> tryRegisterAllMasters(),最终tryRegisterAllMasters()方法会向全部Master发送RegisterApplication(是case class,里面封装了Application的信息)进行Application的注册。






- Spark Master接收到该Application的注册后,会为其分配资源,随后通知相关的Worker为该Application启动相对应的Executor。
全部Executor启动后会反向注册到SparkDeploySchedulerBackend
(这样Driver中的TaskSchedule就知道哪些Executor为其运行Application了)。
DAGSchedule初始化
DAGSchedule位于TaskSchedule后被建立,底层基于DAGScheduleEventProcessActor
线程进行通讯。
DAGSchedule源码简介

SparkUI(4040)
SparkContext中还启动了一个jetty服务器,来提供web服务,显示application运行的状态,这个端口咱们在跑长时间应用的时候常常会使用到。

