Spark中的RDD依赖是什么?

Spe*_*ise 4 apache-spark rdd

据我所知,有两种类型的依赖:narrow和wide.但我不明白依赖对子RDD的影响.是孩子RDD其中包含的信息如何从建立新的RDD块仅元数据父RDD?或者子RDD是从父RDD创建的自给自足的数据集?

Dan*_*bos 8

是的,子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不会发生这种情况,因此依赖关系会被丢弃.

  • RDD是懒惰的.在执行急切动作(如`collect`或`reduce`)之前,所有工作都不会执行.当一个动作最终被执行时,像`map`和`filter`这样的操作被作为一个迭代器链来执行.重要的是RDD通常不代表_data_,它代表_calculation_. (3认同)
  • 好的,但让我们想象一下,我们有Spark作业,并且需要进行下一步计算:(1)RDD->(2)map->(3)filter->(4)collect。在第一阶段,我们输入了RDD,在第二阶段,我们将这些RDD转换为map(kay-value对)。那么,Spark在过滤的第三阶段会得到什么结果?Spark是否会从RDD中删除不必要的项目?还是它将创建带有必要项目的绝对新的RDD并删除先前的项目?过滤后,不需要一堆父RDD的项将是什么? (2认同)
  • RDD通过迭代器实现。因此将读取输入文件,并逐行应用map函数,然后应用filter函数。永远不会存储多于一行。(好吧,它们会一直在内存中徘徊,直到垃圾回收器将它们清理干净为止。)例外是`collect`,它调用`iterator.toArray`将结果转换成数组并将其发送回应用程序。 (2认同)