基于源码的SparkContext初始化动作解析
话不多说,首先附上,总体概览图(这个是spark2.10版本)新版本已经没有SparkDesploySchedulerBackend这个类了。
引入
刚刚接触到Spark的小伙伴,最开始一定会碰到写WordCount程序,或者一些自己的小Demo,每次写的时候都像套模板一样,之前一定要new SparkConf 然后把conf 传给SparkContext对象,那么SparkContext到底为我们做了什么呢?让我们来看看。
TaskScheduler
TaskScheduleImpl到底是个什么东东? 官方TaskSchedulerImpl.scala 的源码描述如下:
// 底层通过调用SchedulerBackend,针对不同种类的cluster(yarn,mesos,standalone),来调度task
// 它也可以通过使用LocalSchedulerBackend,并将参数isLocal设定为true,来在本地模式下工作
// 它可以处理通用逻辑,例如确定跨作业的执行顺序,以及推测任务执行等通用逻辑
// 客户端应该首先调用initialize()和start()方法,然后通过runTask()方法提交task sets
Schedules tasks for multiple types of clusters by acting through a SchedulerBackend.
It can also work with a local setup by using a `LocalSchedulerBackend` and setting isLocal to true.
It handles common logic, like determining a scheduling order across jobs, waking up to launch speculative tasks, etc.
Clients should first call initialize() and start(), then submit task sets through the runTasks method.
哦,那就知道了,TaskSchedule就是调度task的,可以设定执行的模式,处理执行顺序,位置等内部逻辑。其中有初始化启动的动作,还有提交task sets的动作。那么在初始化调用start()方法的时候,具体做了什么呢?
TaskScheduleImpl 中的start方法,发现其实底层还是调用的SchedulerBackend的start方法。那么我们找到对应的SchedulerBackend的start方法。
override def start() {
backend.start()
if (!isLocal && conf.getBoolean("spark.speculation"