spark任务执行流程

●spark任务执行流程 四个步骤

1.构建DAG(调用RDD上的方法)
2.DAGScheduler将DAG切分Stage(切分的依据是shuffle),将Stage生成的Task一TaskSet的形式给TaskScheduler
3.TaskScheduler调度Task(Driver端根据资源情况将Task调度到相应的Exector中)
4.Exetor接受Task,然后将Task丢到线程池中执行

● DAG :

DAG描述多个RDD的转换过程,任务执行时,可以按照DAG的描述,执行真正的计算(数据被操作的一个过程)

DAG是有边界的 :
	开始 :通过SparkContext创建RDD
	结束 :触发Action操作,调用runJob 一个完整的DAG就形成了
	
一个RDD知识描述了数据计算过程中的一个环节,而DAG是有一到多个RDD组成,描述了数据计算过程中的所有环节

一个SparkAppiaction中有一到多个DAG,取决于触发多少次Action

坦白说:DAG就是记录着RDD创建到Action的结束,这就是一个DAG

● DAGScheduler

将一个DAG切分成一到多个Stage,DAGScheduler切分的依据是Shuffle(宽依赖)

为什么要切分Stage?
  一个复杂的业务逻辑(将多台机器上具有相同属性的数据聚合到一台机器上:shuffle)
  如果有shuffle,那么就意味着前面阶段产生的结果后,才能执行下一个阶段,下一个阶段的计算要依赖上一个阶段的数据。
	在同一个Stage中,会有多个算子,可以合并在一起,我们称其为pipeline(流水线:严格按照流程、顺序执行)

● shuffle的定义

shuffle的含义是洗牌,将数据打散,父RDD一个分区的数据如果给了子RDD的多个分区(只要存在这种可能),就是shuffle.
shuffle会有网络传输,但是有网络传输,并不意味着就是shuffle.(宽依赖,窄依赖了解一下)
scala> val a =sc.parallelize(List(("ws",1),("db",1),("bb",2),("ws",3),("db",3)),2)
a: org.apache.spark.rdd.RDD[(String, Int)] = ParallelCollectionRDD[5] at parallelize at <console>:24

scala> val b =a.groupByKey
b: org.apache.spark.rdd.RDD[(String, Iterable[Int])] = ShuffledRDD[7] at groupByKey at <console>:26

scala> b.saveAsTextFile("hdfs://hadoop-01:9000/group")

在这里插入图片描述

● 执行流程图
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/bb23417274/article/details/82940828