概述
Spark是目前相当火爆的大数据分析引擎,笔者使用它也是有一段时间,一直想剖析一下它的源码,从中学到代码设计、系统构建的经验。这一系列分析的Spark版本是2.2.0,这是系列的第一篇,主要从我们最熟悉的SparkContext开始入手。
SparkContext的初始化
TaskScheduler的初始化
我们先来看一下TaskScheduler的初始化是怎么完成的
val (sched, ts) = SparkContext.createTaskScheduler(this, master, deployMode)
_schedulerBackend = sched
_taskScheduler = ts
_dagScheduler = new DAGScheduler(this)
可以看到,createTaskScheduler的方法参数里面有master 和 deployMode, 这两个参数就是我们用spark-submit 命令提交任务时使用的–master 和 –deploy-mode 指定的字符串。下面我们来看一下方法具体的内容
private def createTaskScheduler(
sc: SparkContext,
master: String,
deployMode: String): (SchedulerBackend, TaskScheduler) = {
master match {
case xx => (backend, scheduler)
}
}
master进行模式匹配,根据不同的master 初始化SchedulerBackend 和 TaskScheduler
DAGScheduler的初始化
DAGScheduler的初始化是在TaskScheduler之后的,看如下代码
def this(sc: SparkContext) = this(sc, sc.taskScheduler)
这个是DAGScheduler的构造器,在SparkContext的代码中就是调用这个构造器来初始化DAGScheduler的,可以看到它使用了sc的taskScheduler,所以DAGScheduler需要在TaskScheduler之后初始化