2015-02-14 2 views
3

Как я знаю, существуют два типа зависимостей: узкий & широкий. Но я не понимаю, как зависимость влияет на ребенок RDD. Есть ребенок RDD только метаданные, содержащие информацию о том, как строить новые блоки RDD от parent RDD? Или ребенок RDD является самодостаточным набором данных, который был создан с parent RDD?Что такое зависимость RDD от Spark?

ответ

7

Да, дочерний 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 будет такой . compute выполняется только позже, например, когда вы звоните rdd2.collect.

RDD всегда такие метаданные, даже если у него нет родителей (например, sc.textFile(...)). Единственный случай, когда RDD хранится на узлах, - это если вы пометили его для кэширования с помощью rdd.cache, а затем вызывают его вычисление.

Другая подобная ситуация вызывает rdd.checkpoint. Эта функция отмечает RDD для контрольной точки. В следующий раз, когда он будет вычислен, он будет записан на диск, а позже доступ к RDD заставит его читать с диска вместо пересчета.

Разница между cache и checkpoint заключается в том, что кэшированный RDD по-прежнему сохраняет свои зависимости. Кэшированные данные могут быть отброшены под давлением памяти, и их, возможно, придется пересчитать частично или полностью. Это не может произойти с контрольным RDD, поэтому зависимости отбрасываются там.

+0

Благодарим за четкий ответ. Но для уточнения. Насколько я понимаю, новый преобразованный RDD - это только новый набор указателей на некоторые (отфильтрованные) блоки старых данных? Или новый преобразованный RDD - это новая копия старых данных? Я заинтересован в физических вещах, которые происходят в кластере с RDD во время трансформации. – Speise

+2

RDDs ленивы. Ни одна из работ не выполняется до тех пор, пока не будет выполнено действие с нетерпением (например, 'collect' или' reduce'). Когда действие в конечном счете выполняется, операции типа «map» и «filter» выполняются как цепочка итераторов. Важным моментом является то, что RDD обычно не представляет _data_, он представляет _calculation_. –

+1

Хорошо, но представьте себе, что у нас есть работа Spark со следующими шагами вычислений: (1) RDD -> (2) map -> (3) filter -> (4) collect. На первом этапе у нас есть вход RDD, на втором этапе мы преобразуем эти RDD в карту (пары значений kay). Итак, каков результат Искры на третьем этапе во время фильтрации? Будет ли Spark просто удалять ненужные элементы из RDD? Или он создаст абсолютно новый RDD с необходимыми элементами и удалит предыдущий? Что будет с кучей элементов родительского RDD, которые не нужны после фильтрации? – Speise