中国万网域名注册官网,青浦网站优化,wordpress 3.6 下载,网站建设评语窄依赖和宽依赖
窄依赖#xff1a;
指父RDD的每一个分区最多被一个子RDD的分区所用#xff0c;表现为一个父RDD的分区对应于一个子RDD的分区#xff0c;和两个父RDD的分区对应于一个子RDD 的分区。图中#xff0c;map/filter和union属于第一类#xff0c;对输入进行协同…窄依赖和宽依赖
窄依赖
指父RDD的每一个分区最多被一个子RDD的分区所用表现为一个父RDD的分区对应于一个子RDD的分区和两个父RDD的分区对应于一个子RDD 的分区。图中map/filter和union属于第一类对输入进行协同划分co-partitioned的join属于第二类。
宽依赖
指子RDD的分区依赖于父RDD的所有分区这是因为shuffle类操作如图中的groupByKey和未经协同划分的join。 Stage
一个Job会被拆分为多组Task每组任务被称为一个Stage就像Map Stage Reduce Stage。Stage的划分在RDD的论文中有详细的介绍简单的说是以shuffle和result这两种类型来划分。在Spark中有两类task一类是shuffleMapTask一类是resultTask第一类task的输出是shuffle所需数据第二类task的输出是resultstage的划分也以此为依据shuffle之前的所有变换是一个stageshuffle之后的操作是另一个stage。比如 rdd.parallize(1 to 10).foreach(println) 这个操作没有shuffle直接就输出了那么只有它的task是resultTaskstage也只有一个如果是rdd.map(x (x, 1)).reduceByKey(_ _).foreach(println), 这个job因为有reduce所以有一个shuffle过程那么reduceByKey之前的是一个stage执行shuffleMapTask输出shuffle所需的数据reduceByKey到最后是一个stage直接就输出结果了。如果job中有多次shuffle那么每个shuffle之前都是一个stage. 会根据RDD之间的依赖关系将DAG图划分为不同的阶段对于窄依赖由于partition依赖关系的确定性partition的转换处理就可以在同一个线程里完成窄依赖就被spark划分到同一个stage中而对于宽依赖只能等父RDD shuffle处理完成后下一个stage才能开始接下来的计算。之所以称之为ShuffleMapTask是因为它需要将自己的计算结果通过shuffle到下一个stage中 Stage划分思路
因此spark划分stage的整体思路是从后往前推遇到宽依赖就断开划分为一个stage遇到窄依赖就将这个RDD加入该stage中。因此在图2中RDD C,RDD D,RDD E,RDDF被构建在一个stage中,RDD A被构建在一个单独的Stage中,而RDD B和RDD G又被构建在同一个stage中。 在spark中Task的类型分为2种ShuffleMapTask和ResultTask简单来说DAG的最后一个阶段会为每个结果的partition生成一个ResultTask即每个Stage里面的Task的数量是由该Stage中最后一个RDD的Partition的数量所决定的而其余所有阶段都会生成ShuffleMapTask之所以称之为ShuffleMapTask是因为它需要将自己的计算结果通过shuffle到下一个stage中也就是说图2中的stage1和stage2相当于mapreduce中的Mapper,而ResultTask所代表的stage3就相当于mapreduce中的reducer。
总结
map,filtre为窄依赖 groupbykey为款依赖 遇到一个宽依赖就分一个stage
原文链接https://blog.csdn.net/a1043498776/article/details/54889922