Spark on Yarn WordCount的执行流程
- 本篇内容
- 脚本提交篇
- SparkSubmit 类的main函数
- Spark WordCount的用户代码
- WordCount程序的执行流程
- 创建SparkConf
- 创建SparkContext
- SparkContext类图 ![SparkContext类图](https://i-blog.csdnimg.cn/blog_migrate/a45b3db88644667d94df1143999acb8c.png)
- SparkContext的SchedulerBackend和TaskScheduler的创建过程
- ExternalClusterManager体系
- SchedulerBackend类继承体系
- TaskScheduler类继承体系
- SparkContext中的TaskScheduler(YarnScheduler)的启动过程
- YarnScheduler启动后,Yarn设备在集群其他机器上大致是怎么处理的
- Spark任务的产生、分发与执行
- Tips
本篇内容
讲述的是Spark2.3.2 on Yarn版本的WordCount的大致执行流程
脚本提交篇
SparkSubmit 类的main函数
脚本提交完成后,Spark会调用SparkSubmit类的main函数执行正式的任务提交
Spark WordCount的用户代码
package spark.wordcount
import org.apache.spark.{SparkConf, SparkContext}
object SparkWordCount {
def main(args: Array[String]):Unit = {
val conf = new SparkConf().setAppName("Spark Word Count")
val sc = new SparkContext(conf)
val startTime:Long = sc.startTime
println(startTime)
val words = sc.textFile("hdfs://bigdatamaster:9000/data/test/")
val result = words.flatMap(line => line.split("\\s|,"))
.map(word => (word, 1))
.reduceByKey(_ + _)
result.collect().foreach(word => println(word))
}
}
WordCount程序的执行流程
创建SparkConf
创建SparkContext
SparkContext类图 ![SparkContext类图](https://i-blog.csdnimg.cn/blog_migrate/a45b3db88644667d94df1143999acb8c.png)
SparkContext的SchedulerBackend和TaskScheduler的创建过程
ExternalClusterManager体系
SchedulerBackend类继承体系
TaskScheduler类继承体系
SparkContext中的TaskScheduler(YarnScheduler)的启动过程
YarnScheduler启动后,Yarn设备在集群其他机器上大致是怎么处理的
下图是从Driver开始运行的
Spark任务的产生、分发与执行
一个大致的Spark各个概念之间的关系
- 大致关系
大致上就是,每次我们自己手动提交的任务是一个Application,每个Application中会被分成多个Job,每个Job会拆成多个Stage,每个Stage中包含N个Task - Spark何时会产生一个新的Job
凡是调用sc.runJob的算子都会提交一个新的Job
Spark WordCount的代码所产生的RDD关系图和对应的Stage
WordCount的Job提交过程
- Stage的产生顺序
Job上的Stage是按照倒序递归产生的,所以会先生成ResultStage,但是生成ResultStage之后,并不会先行执行ResultStage的任务,而是顺着ResultStage的依赖关系,向上继续寻找有没有ShuffleMapStage需要被提交。
ShuffleMapStage的判断标准便是 RDD的getDenpendency是否获取到ShuffleDependency。 - WordCount程序中会产生一个ShuffleMapStage
WordCount程序中的ResultStage是由sc.collect函数产生的,reduceByKey函数产生的ShuffledRDD类中的getDependency就是获取到ShuffleDependency,所以reduceByKey会产生一个ShuffleMapStage。
WordCount的Stage
- 任务分类
ShuffleMapStage上的任务是ShuffleMapTask
ResultStage上的任务是ResultTask
两种任务的分发和被调用的过程是一样的,但是结果的处理是不一样的
Stage上的任务的提交
Stage上的任务的生成过程
Stage上的任务在Executor上的执行过程
ShuffleMapTask
ShuffleMapTask的RDD任务是如何执行的
- ShuffleWriter的选择过程(ShuffleMapStage使用的是SortShuffleWriter)
ShuffleMapTask的RDD任务的执行结果是如何处理的
- SortShuffleWriter的write过程,write会将RDD链产生的iterator写入到一个文件中
- ExternalSorter的insertAll过程
- ExternalSorter的写文件过程
- ExternalSorter将数据从temp文件写入到最终文件的过程
ShuffleMapTask的返回值MapStatus
- MapStatus的数据结构
- MapStatus的用途
ResultTask的执行
Tips
- 从HadoopRDD产生的Stage的partitions个数是由文件分片的个数决定的,比如有40000个不可分割的压缩文件,那么就有40000个任务
- ResultStage的partitions个数是由“spark.default.parallelism”参数配置决定的
- 任务分配到Executor之后,会被存放到java的TreadPool中等待执行,所以partitions个数可以多过Executor个数