TaskScheduler是Spark的任务调度器,属于低级调度器,一个SparkContext只有一个TaskScheduler,它负责接收DAGScheduler为每个stage生成的任务集,接着将任务集分配到集群中运行,再将结果返回给DAGScheduler,TaskScheduler通过TaskSchedulerImpl实现,因此了解了TaskSchedulerImpl就可以了解TaskScheduler,此外TaskScheduler有两种任务调度方式,FAIR和FIFO(默认)
PS:之前我认为一个executor只能运行一个task,其实不是这样,一个executor可以运行多个任务,每个任务是由一个线程运行,这点在Task类中也有体现,总而言之,executor可以看做是一个进程,进程可以由多个线程组成,这些线程就是分别用来执行任务的,线程是通过线程池进行分配的
1.TaskSet
任务集,由一些任务Task所组成
1.1 TaskMetrics
任务的一些度量指标,如:任务运行的主机名,从节点(具体点说是executor)运行该任务所花的时间,任务结果的大小等等
1.2 TaskContext
任务的基本信息,包括任务所属的stage,分区id(其实就可以理解为任务id),以及是否为本地运行,还有上述所提到过的TaskMetrics,完成判断任务是否完成,以及任务完成时执行回调函数
1.3 TaskLocation
说明了任务运行在哪个主机上以及那个从节点上,包括主机名,从节点Id,实质上就是指明任务的运行位置
1.4 Task
Task,即任务,是executor执行的对象,感觉Task类的主要任务就是声明一个任务,包括任务所属的stage,分区id,完成或者kill一个任务(即将任务的中断标志设置为真,该标志就存在于TaskContext中),以及序列化,反序列化任务执行所需的JAR包,文件以及任务本身,同时还声明了runTask()方法,但并未实现
一个任务就是某个stage中RDD的一个分区的数据及其在这个stage中所做的一系列转换或者说动作(实质上就是我们应用程序中涉及到的函数),TaskSet就是由上述所定义的Task所组成的数组,此外,还添加了stageId,attempt(尝试次数),以及优先级,属性等字段
1.5 TaskState
任务运行的状态,有LOST(如果任务丢失,则运行该任务的executor要停止其上的所有任务,这点在TaskSchedulerImpl的stateUpdate方法中会提到),FINISHED,KILLED状态等等,不同的状态会触发不同的操作,不过总体来说都是从相应的容器中删除对应的记录。
未完待续。。。