Spark 窄依赖 宽依赖 定义示例源码(你记不住是全网都说错了!!!)点击这里看全文
定义
子RDD依赖小数量的父RDD的分区的依赖叫做窄依赖。依赖的越少越窄。
---------------------------------------记种这句话,就永远不会忘记怎么区分窄依赖宽依赖了
子RDD依赖最多(也就是所有)父RDD的分区的依赖叫做宽依赖。
子RDD依赖小数量(也就是所有)父RDD的分区的依赖叫做窄依赖。
子RDD依赖最小数量(也就是1个)父RDD的分区的依赖更叫做窄依赖。
不信可以看下边窄依赖的源码注释!!!!!
/**
* :: DeveloperApi ::
* Base class for dependencies where each partition of the child RDD depends on a small number
* of partitions of the parent RDD. Narrow dependencies allow for pipelined execution.
*/
@DeveloperApi
abstract class NarrowDependency[T](_rdd: RDD[T]) extends Dependency[T] {
/**
* Get the parent partitions for a child partition.
* @param partitionId a partition of the child RDD
* @return the partitions of the parent RDD that the child partition depends upon
*/
def getParents(partitionId: Int): Seq[Int]
override def rdd: RDD[T] = _rdd
}
示例
-
宽依赖的算子 :join(非hash-partitioned)、groupByKey、partitionBy
-
窄依赖的算子 :map、filter、union、join(hash-partitioned)、mapPartitions;
请结合定义思考示例的合理性。
Stage如何划分
在Spark中,DAG(有向无环图)表示了作业的执行计划,由一系列RDD和它们之间的转换操作组成。当遇到宽依赖时,Spark会将DAG划分为多个Stage,以实现并行执行。
每个Stage包含一组任务,这些任务可以并行执行。每个任务对应于输入RDD的一个分区,它执行相同的转换操作,并生成输出RDD的一个分区。这样,每个Stage可以独立地处理其输入分区,而无需等待其他Stage的完成。
Stage的划分是根据宽依赖来进行的。宽依赖表示子RDD的每个分区依赖于父RDD的所有分区,即需要进行数据洗牌和重新分区的情况。在这种情况下,Spark会将具有相同宽依赖的RDD划分到同一个Stage中,以确保在执行Shuffle操作之前,所有必要的数据都已经准备好。
通过将DAG划分为多个Stage,并将任务并行化执行,Spark能够最大程度地提高作业的执行效率和性能。这种并行执行的方式充分利用了集群中的资源,同时还能减少数据传输和等待时间,提高整体计算速度。
源码
package org.apache.spark
import scala.reflect.ClassTag
import org.apache.</