Spark 中的 RDD 依赖是什么?

What is RDD dependency in Spark?

据我所知,有两种类型的依赖关系:窄和宽。但我不明白依赖性如何影响 child RDDchild RDD 是否只有包含如何从 parent RDD 构建新 RDD 块的信息的元数据?或者 child RDD 是从 parent RDD?

创建的自给自足的数据集

是的,子RDD是描述如何从父RDD计算RDD的元数据。

考虑 org/apache/spark/rdd/MappedRDD.scala 例如:

private[spark]
class MappedRDD[U: ClassTag, T: ClassTag](prev: RDD[T], f: T => U)
  extends RDD[U](prev) {

  override def getPartitions: Array[Partition] = firstParent[T].partitions

  override def compute(split: Partition, context: TaskContext) =
    firstParent[T].iterator(split, context).map(f)
}

当你说rdd2 = rdd1.map(...)时,rdd2就会是这样的MappedRDDcompute 仅在稍后执行,例如当您调用 rdd2.collect.

RDD 始终是这样的元数据,即使它没有父项(例如 sc.textFile(...))。 RDD 存储在节点上的唯一情况是,如果您使用 rdd.cache 将其标记为缓存,然后计算它。

另一个类似的情况是调用rdd.checkpoint。此函数将 RDD 标记为检查点。下次计算时会写入磁盘,以后访问RDD会导致从磁盘读取而不是重新计算。

cachecheckpoint 的区别在于缓存的 RDD 仍然保留其依赖关系。缓存的数据在内存压力下可能会被丢弃,可能需要部分或全部重新计算。这不会发生在带检查点的 RDD 上,因此相关性会被丢弃。