Task是什么
task是一个执行单元。我们有两种任务:
- org.apache.spark.scheduler.ShuffleMapTask
- org.apache.spark.scheduler.ResultTask
Spark作业由一个或多个stages组成。
job的最后一个阶段是由多个ResultTasks组成的,之前的stages由ShuffleMapTasks组成。
ResultTask执行task并将task输出返回给driver Application。
ShuffleMapTask执行task,并将task输出分配给多个bucket(基于task的partitioner个数)。
Task源码解析
- 前提:Executor接收到LaunchTask(),运行TaskRunner(),执行Executor.run()方法;
- updateDependencies()为task运行准备工作,加载配置文件,jars
- 反序列化task,调用Task.run( )方法
- Task.run( )方法,其实是调用Task的抽象方法runTask( )
- ShuffleMapTask.runTask( )
- ResultTask.runTask( )
伪代码:Executor的run方法
override def run(): Unit = {
//拷贝配置文件 jar 资源 之类 拷贝过来
updateDependencies(taskDescription.addedFiles, taskDescription.addedJars)
/**
* 调用 task的 run()方法
* 返回 task【ShuffleMapTask/ResultTask】结果数据的存储位置
*/
val value = try {