Spark 任务执行的流程

Spark 任务执行的流程

四个步骤
1.构建DAG(调用RDD上的方法)
2.DAGScheduler将DAG切分Stage(切分的依据是Shuffle),将Stage中生成的Task以TaskSet的形式给TaskScheduler
3.TaskScheduler调度Task(根据资源情况将Task调度到相应的Executor中)
4.Executor接收Task,然后将Task丢入到线程池中执行

 

 

DAG 有向无环图(数据执行过程,有方法,无闭环)

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

DAG是有边界的:开始(通过SparkContext创建的RDD),结束(触发Action,调用run Job就是一个完整的DAG就形成了,一旦触发Action就形成了一个完整的DAG)

一个RDD只是描述了数据计算过程中的一个环节,而DGA由一到多个RDD组成,描述了数据计算过程中的所有环节(过程)

一个Spark Application中是有多少个DAG:一到多个(取决于触发了多少次Action)

--------------------------------------------

一个DAG中可能有产生多种不同类型和功能的Task,会有不同的阶段

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

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

--------------------------------------------

 宽依赖和窄依赖 一般来说普通的join都是宽依赖

 

 rdd的特殊jion  

 

 

 

 

stage过程,3个stage 6 个Task 一个stage有两个分区就有两个Task,一个Application有很多job,job划分依据run job行动算子,调用了几次就有几个job ,stage划分是依据suffle来的,相同的过程划分到同一个stage,产生shuffle的阶段一份为二。

 

 

 

 

Jion底层源码 

 

 Rdd的依赖关系 ,记录当前rdd的父亲rdd从哪来,本来一个rdd有两个分区,map循环遍历,比较每个分区的partitioner如果类型一致又相同,其实分区个数一样就默认认为窄依赖,如果不等就是宽依赖,Some(part)是自己传入的分区个数。

 

 

 HashPartitioner源码

 

 根据源码发现,如果改变了分区数,就会产生suffle了   如

任务将划分5个Stage

 

 

 

 

 

 

 

 

 



posted @ 2021-05-28 11:12  每天都要进步啊  阅读(953)  评论(0编辑  收藏  举报