Spark 任务提交执行流程
在 Spark 的作业提交及任务执行流程中就介绍了一个任务从提交到集群是如何执行的(如上图),其中最重要的是启动 Driver,Executor,和 Task.Driver 负责给 Executor 分配 Task 执行。下面看一看一个任务是如何变为一个个 Task 被 Executor 执行的。
Spark 程序执行计划
仍然以 wordCount 为例,
val linesRDD = sc.textFile("input/words")
val wordsRDD = lines.flatMap((line) =>line.split(" "))
val pairsRDD = words.map(word =>(word,1))
val wordCountsRDD = pairs.reduceByKey(_+_).sortByKey();
wordCounts.foreach(wordcount =>println(wordcount._1+" - "+wordcount._2))
生成逻辑执行计划(logical execution plan)
上面的程序在执行的过程中会产生很多的 RDD,这些 RDD 之间会形成一种依赖关系,我们把生成的依赖关系图叫做逻辑查询计划。wordCountsRDD 依赖 pairsRDD,pairsRDD 依赖 wordsRDD,wordsRDD 依赖 linesRDD,最终执行 action 的时候触发任务的执行,这个执行过程是一个回溯的过程,foreach 操作会一步步向前找到数据来源开始执行直到得到 wordCountsRDD,然后将其输出。逻辑执行计划是 RDD 的 Transformations 函数的 DAG。
生成物理执行计划(physical execution plan)
在生成逻辑查询计划之后,会根据具体的数据,进行分区,stage 划分,每个 stage 的 task 的划分。物理执行计划是 stage 的 DAG.
partition 划分:
Stage 划分:stage的划分算法,主要是取决于宽依赖和窄依赖
.一个 Partition 依赖于一个 partition 这种依赖关系叫做窄依赖,一个 paritition 依赖于多个 paritition 就是宽依赖,宽依赖是Shuffle操作产生的。
Task 划分:Driver 会把每个 stage 划分成多个 Task.这些 task 之间也会有依赖关系,所以 task 的执行也是有先后顺序的。Driver 序列化 task 并按顺序调度每个 task 到 Executor 上执行。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于