宽窄依赖
RDD之间有一系列的依赖关系,依赖关系又分为窄依赖和宽依赖。Spark中的Stage其实就是一组并行的任务,任务是一个个的task 。
- 宽依赖(Shuffle Dependency)
父RDD与子RDD partition之间的关系是一对多。会有shuffle的产生。父RDD的一个分区的数据去到子RDD的不同分区里面。
-
窄依赖 (Narrow Dependency)
父RDD和子RDD partition之间的关系是一对一的。或者父RDD一个partition只对应一个子RDD的partition情况下的父RDD和子RDD partition关系是多对一的。不会有shuffle的产生。父RDD的一个分区去到子RDD的一个分区。
Stage划分算法原理:遇到一个宽依赖就划分一个stage(数据是否需要重组)
Stage概念:由一组并行的task组成
Task:
Task是在集群上运行的基本单位。一个Task负责处理RDD的一个partition。RDD的多个patition会分别由不同的Task去处理。这些Task的处理逻辑完全是一致的。这一组Task就组成了一个Stage。
stage计算模式
pipeline管道计算模式,pipeline只是一种计算思想,模式。
来一条数据然后计算一条数据,把所有的逻辑走完,然后落地,一个task处理完分区的数据
因此跨过了不同的逻辑的分区,是完全基于内存计算的。
**stage的并行度:**是由stage的最后一个RDD的分区数来决定的 。一般来说,一个partiotion对应一个task,但最后reduce的时候可以手动改变reduce的个数,也就是分区数,即改变了并行度。例如reduceByKey(XXX,3),GroupByKey(4),union由的分区数由前面的相加。
如何提高stage的并行度:reduceBykey(xxx,numpartiotion),join(xxx,numpartiotion)
shuffle与stage
shuffle是对数据重新组合和分配
shuffle 是划分 DAG 中 stage 的标识,同时影响 Spark 执行速度的关键步骤
shuffle 操作是 spark 中最耗时的操作,应尽量避免不必要的 shuffle
窄依赖跟宽依赖的区别是是否发生 shuffle(洗牌) 操作.宽依赖会发生 shuffle 操作.
窄依赖是子 RDD的各个分片(partition)不依赖于其他分片,能够独立计算得到结果;
宽依赖指子 RDD 的各个分片会依赖于父RDD 的多个分片,所以会造成父 RDD 的各个分片在集群中重新分片
// Map: "cat" -> c, cat
val rdd1 = rdd.Map(x => (x.charAt(0), x)) //并行化
// groupby same key and count
val rdd2 = rdd1.groupBy(x => x._1).
Map(x => (x._1, x._2.toList.length)) //宽依赖
DAG有向流程图
参考
https://csguo.blog.csdn.net/article/details/82703723
https://blog.csdn.net/anzhsoft/article/details/38358817
https://csguo.blog.csdn.net/article/details/82704623