据我所知,有两种类型的依赖关系:窄和宽。但我不明白依赖性如何影响子RDD. Is 子RDD仅包含如何构建新 RDD 块的信息的元数据父RDD? Or 子RDD是自给自足的数据集,其创建自父RDD?
是的,子RDD是描述如何从父RDD计算RDD的元数据。
考虑org/apache/spark/rdd/MappedRDD.scala https://github.com/apache/spark/blob/v1.2.0/core/src/main/scala/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
将会是这样一个MappedRDD
. compute
仅稍后执行,例如当您调用时rdd2.collect
.
RDD 始终是这样的元数据,即使它没有父级(例如sc.textFile(...)
)。 RDD 存储在节点上的唯一情况是,如果您将其标记为缓存rdd.cache
,然后对其进行计算。
另一种类似的情况是调用rdd.checkpoint
。该函数将 RDD 标记为检查点。下次计算时,它会被写入磁盘,稍后访问 RDD 会导致从磁盘读取它,而不是重新计算。
和...之间的不同cache
and checkpoint
是缓存的 RDD 仍然保留其依赖关系。缓存的数据在内存压力下可能会被丢弃,并且可能需要部分或全部重新计算。对于带有检查点的 RDD 来说,这种情况不会发生,因此依赖项会被丢弃。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)