RDD的依赖有两大类

NarrowDependency (窄依赖)

定义了一个抽象方法, getParent , 用于获取子RDD分区对应的父RDD分区列表。

def getParents(partitionId: Int): Seq[Int]

OneToOneDependency

非常基础的依赖关系,表示每个子RDD分区都一对一的依赖于父RDD分区。

RangeDependency

构造器要传三个参数,

  • inStart: 父RDD起始位置
  • outStart: 子RDD起始位置
  • length: 依赖range的长度

当length=1时, RangeDependency就退化成为了OneToOneDependency

PruneDependency

PruneDependency 描述了 PartitionPruningRDD 和它对应父RDD的依赖关系。
看名字 Prune —— 修剪,这里特指是对分区的修剪, 所以它的构造方法要传入一个 partitionFilterFunc, 用于执行修剪过滤。

the child RDD contains a subset of partitions of the parents

  @transient
  val partitions: Array[Partition] = rdd.partitions
    .filter(s => partitionFilterFunc(s.index)).zipWithIndex
    .map { case(split, idx) => new PartitionPruningRDDPartition(idx, split) : Partition }

  override def getParents(partitionId: Int): List[Int] = {
    List(partitions(partitionId).asInstanceOf[PartitionPruningRDDPartition].parentSplit.index)
  }

它对应的RDD是PartitionPruningRDD

ShuffleDependency(新Stage的标志)