RDD任务切分中间分为:Application、Job、Stage和Task
(1)Application:初始化一个SparkContext即生成一个Application;
(2)Job:一个Action算子就会生成一个Job;
(3)Stage:Stage等于宽依赖的个数加1;
(4)Task:一个Stage阶段中,最后一个RDD的分区个数就是Task的个数。
注意:Application->Job->Stage->Task每一层都是1对n的关系
主要步骤
// 代码样例
def main(args: Array[String]): Unit = {
//1.创建SparkConf并设置App名称
val conf: SparkConf = new SparkConf().setAppName("SparkCoreTest").setMaster("local[*]")
//2.创建SparkContext,该对象是提交Spark App的入口
val sc: SparkContext = new SparkContext(conf)
val rdd:RDD[String] = sc.textFile("input/1.txt")
val mapRdd = rdd.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)
mapRdd.saveAsTextFile("outpath")
//3.关闭连接
sc.stop()
}
先看下执行流程图(Yarn-Cluster)

现在一步一步分析
第一步
-
执行main方法
-
初始化sc
-
执行到Action算子
这个阶段会产生血缘依赖关系,具体的代码并没有执行

第二步:DAGScheduler对上面的job切分stage,stage产生task

DAGScheduler: 先划分阶段(stage)再划分任务(task)
这个时候会产生Job的stage个数 = 宽依赖的个数+1 = 2 (这个地方产生一个宽依赖),也就是产生shuffle这个地方
Job的Task个数= 一个stage阶段中,最后一个RDD的分区个数就是Task的个数(2+2 =4)shuffle前的ShuffleStage产生两个
shuffle后reduceStage产生两个
第三步:TaskSchedule通过TaskSet获取job的所有Task,然后序列化分给Exector

job的个数也就是 = Action算子的个数(这里只一个collect)
源码分析
一步一步从collect()方法找下会找到这段主要代码
———————————————————————————————1—————————————————————————————————
var finalStage: ResultStage = null
try {
// New stage creation may throw an exception if, for example, jobs are run on a
// HadoopRDD whose underlying HDFS files have been deleted.
finalStage = createResultStage(finalRDD, func, partitions, jobId, callSite)
} catch {
case e: Exception =>
logWarning("Creating new stage failed due to exception - job: " + jobId, e)
listener.jobFailed(e)
return
}
finalStage = createRe

本文深入探讨了Apache Spark中RDD的任务调度机制,包括Application、Job、Stage和Task的概念及其关系。详细分析了从Action算子触发到Task执行的全过程,以及DAGScheduler如何将Job划分为Stage,并最终确定Task的执行计划。
最低0.47元/天 解锁文章
1598

被折叠的 条评论
为什么被折叠?



