DAGScheduler概述:是一个面向Stage层面的调度器;
主要入参有:
dagScheduler.runJob(rdd, cleanedFunc, partitions, callSite, allowLocal,resultHandler, localProperties.get)
rdd: final RDD;
cleanedFunc: 计算每个分区的函数;
resultHander: 结果侦听器;
主要功能如下:
1、接收用户提交的job;
2、将job根据类型划分为不同的stage,记录哪些RDD、Stage被物化,并在每一个stage内产生一系列的task,并封装成TaskSet;
3、决定每个Task的最佳位置(任务在数据所在的节点上运行),并结合当前的缓存情况;将TaskSet提交给TaskScheduler;
4、重新提交Shuffle输出丢失的Stage给TaskScheduler;
注:一个Stage内部的错误不是由shuffle输出丢失造成的,DAGScheduler是不管的,由TaskScheduler负责尝试重新提交task执行;
以如下示例描述Job提交过程:
val sc = new SparkContext("local[2]", "WordCount", System.getenv("SPARK_HOME"), Seq(System.getenv("SPARK_TEST_JAR"))) val textFile = sc.textFile("xxx") val result = textFile.flatMap(line => line.split("\t")).map(word => (word, 1)).reduceByKey(_ + _) result.collect
RDD.collect
==>sc.runJob #####至此完成了将RDD提交DAGScheduler#####
val results = new Array[U](partitions.size) //result存放的是返回值,数组大小为最后一个RDD的partition的个数
==>dagScheduler.runJob(rdd, func, partitions, resultHandler......) //DAGScheduler的输入:RDD and partitions to compute
==>dagScheduler.submitJob
==>eventProcessActor ! JobSubmitted