其余更多java基础文章:
java基础学习(目录)java
指父RDD的每个分区最多被一个子RDD的分区所用,表现为一个父RDD的分区对应于一个子RDD的分区,和两个父RDD的分区对应于一个子RDD 的分区。图中,map/filter和union属于第一类,对输入进行协同划分(co-partitioned)的join属于第二类。源码分析
指子RDD的分区依赖于父RDD的全部分区,这是由于shuffle类操做,如图中的groupByKey和未经协同划分的join。post
DAG,有向无环图,Directed Acyclic Graph的缩写,经常使用于建模。Spark中使用DAG对RDD的关系进行建模,描述了RDD的依赖关系,这种关系也被称之为lineage,RDD的依赖关系使用Dependency维护,参考Spark RDD之Dependency,DAG在Spark中的对应的实现为DAGScheduler。学习
在spark中,会根据RDD之间的依赖关系将DAG图划分为不一样的阶段,一个Job会被拆分为多组TaskSet,每组任务被称为一个Stage。对于窄依赖,因为partition依赖关系的肯定性,partition的转换处理就能够在同一个线程里完成,窄依赖就被spark划分到同一个stage中,而对于宽依赖,只能等父RDD shuffle处理完成后,下一个stage才能开始接下来的计算。spa
所以spark划分stage的总体思路是:从后往前推,遇到宽依赖就断开,划分为一个stage;遇到窄依赖就将这个RDD加入该stage中。所以在上图中RDD C,RDD D,RDD E,RDDF被构建在一个stage中,RDD A被构建在一个单独的Stage中,而RDD B和RDD G又被构建在同一个stage中。线程
在spark中,Task的类型分为2种:ShuffleMapTask和ResultTask;cdn
每一个Stage里面的Task的数量是由该Stage中最后一个RDD的Partition的数量所决定的blog
注意:同一个Stage的执行是串行的,好比Stage2的RDD C-D-F中,假设只有一个CPU core ,Spark是先将一条数据按C-D-F的顺序执行完后,再运行下一条数据。而不是将全部数据从RDD C中计算到RDD D了,再往下计算RDD F。ip
RDD的宽窄依赖的划分是为了划分Stage,划分Stage是为了Pipline计算模型的实现,Pipline的计算模式可以以一种管道流的方式,以高阶函数的形式实现数据的本地化,传逻辑而不传输数据。在Pipline计算模式遇到持久化算子或者Shuffle(宽依赖算子)时候就会产生数据的落地。