Spark 作业提交、分发、执行的大致流程

本篇内容

讲述的是Spark2.3.2 on Yarn版本的WordCount的大致执行流程

脚本提交篇

spark的脚本提交流程

SparkSubmit 类的main函数

脚本提交完成后,Spark会调用SparkSubmit类的main函数执行正式的任务提交
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

SparkConf

创建SparkContext

SparkContext

SparkContext类图 SparkContext类图
SparkContext的SchedulerBackend和TaskScheduler的创建过程

SchedulerBackend和TaskScheduler的创建

ExternalClusterManager体系

ExternalClusterManager

SchedulerBackend类继承体系

SchedulerBackend类继承体系

TaskScheduler类继承体系

TaskScheduler类即成体系

SparkContext中的TaskScheduler(YarnScheduler)的启动过程

YarnSchedulerImpl启动过程

YarnScheduler启动后,Yarn设备在集群其他机器上大致是怎么处理的

下图是从Driver开始运行的
SparkOnYarn

Spark任务的产生、分发与执行

一个大致的Spark各个概念之间的关系

Spark中的各个概念之间的关系

  • 大致关系
    大致上就是,每次我们自己手动提交的任务是一个Application,每个Application中会被分成多个Job,每个Job会拆成多个Stage,每个Stage中包含N个Task
  • Spark何时会产生一个新的Job
    凡是调用sc.runJob的算子都会提交一个新的Job
Spark WordCount的代码所产生的RDD关系图和对应的Stage

RDD关系图

WordCount的Job提交过程

Spark的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

WordCount Stage

  • 任务分类
    ShuffleMapStage上的任务是ShuffleMapTask
    ResultStage上的任务是ResultTask
    两种任务的分发和被调用的过程是一样的,但是结果的处理是不一样的
Stage上的任务的提交

Task Submit

Stage上的任务的生成过程

Task Generator

Stage上的任务在Executor上的执行过程

Task on Executor

ShuffleMapTask
ShuffleMapTask的RDD任务是如何执行的
iterator
iterator
iterator
HadoopRDD
MapPartitionsRDD
MapPartitionsRDD
ShuffleWriter
  • ShuffleWriter的选择过程(ShuffleMapStage使用的是SortShuffleWriter)
    ShuffleWriter
ShuffleMapTask的RDD任务的执行结果是如何处理的
  • SortShuffleWriter的write过程,write会将RDD链产生的iterator写入到一个文件中
    SortShuffleWriter
  • ExternalSorter的insertAll过程
    在这里插入图片描述
  • ExternalSorter的写文件过程
    ExternalSorter write
  • ExternalSorter将数据从temp文件写入到最终文件的过程
    ExternalSorter merge
ShuffleMapTask的返回值MapStatus
  • MapStatus的数据结构
    DS of MapStatus
  • MapStatus的用途
    MapStatus的用途
ResultTask的执行

ResultTask

Tips

  1. 从HadoopRDD产生的Stage的partitions个数是由文件分片的个数决定的,比如有40000个不可分割的压缩文件,那么就有40000个任务
  2. ResultStage的partitions个数是由“spark.default.parallelism”参数配置决定的
  3. 任务分配到Executor之后,会被存放到java的TreadPool中等待执行,所以partitions个数可以多过Executor个数
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值