(七)Spark源码理解之TaskScheduler----part1

本文详细阐述了Spark中TaskScheduler的作用及工作流程,解释了Task集、Task类及其相关组件的功能,同时介绍了Task运行状态的管理与不同调度方式(FAIR和FIFO)的区别。重点讨论了如何理解Task在Executor中的执行过程,以及Executor作为进程如何通过线程池高效执行任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        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状态等等,不同的状态会触发不同的操作,不过总体来说都是从相应的容器中删除对应的记录。

未完待续。。。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值