据我所知,有两种类型的依赖:narrow和wide.但我不明白依赖对子RDD的影响.是孩子RDD其中包含的信息如何从建立新的RDD块仅元数据父RDD?或者子RDD是从父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)
}
Run Code Online (Sandbox Code Playgroud)
当你说rdd2 = rdd1.map(...),rdd2将是这样的MappedRDD.compute只会在以后执行,例如当你打电话时rdd2.collect.
RDD始终是这样的元数据,即使它没有父元素(例如sc.textFile(...)).RDD存储在节点上的唯一情况是,如果您将其标记为使用缓存rdd.cache,然后使其计算.
另一个类似的情形在呼唤rdd.checkpoint.此功能标记RDD以进行检查点.下次计算时,它将被写入磁盘,稍后访问RDD将导致从磁盘读取而不是重新计算.
cache和之间的区别在于checkpoint缓存的RDD仍然保留其依赖关系.缓存的数据可以在内存压力下丢弃,并且可能需要部分或全部重新计算.检查点RDD不会发生这种情况,因此依赖关系会被丢弃.
| 归档时间: |
|
| 查看次数: |
4103 次 |
| 最近记录: |