Искра без кэширования RDD выселение из памяти - PullRequest
1 голос
/ 28 апреля 2019

Из этого поста Как долго СДР остается в памяти? , я хотел бы знать, основываясь на следующем:

СДР является объектом, как и любой другой.Если вы не сохраните / не кешируете его, он будет действовать так же, как и любой другой объект в управляемом языке, и будет собираться, если на него не останется живых корневых объектов?

Что означает точно на раз нет живых корневых объектов, указывающих на него ?

  • Например, когда действие было завершено?
  • Или, если преобразования были выполнены успешно?

Я прочитал столько, сколько смог найти,но считаю, что всегда есть открытая проблема в моей голове.Ответ известного эксперта заставляет меня задуматься о том, что я не могу выселить.

Когда создается родословная СДР?Как найти график родословной? пример отличный, повторно представлен здесь:

val nums = sc.parallelize(0 to 9)
scala> nums.toDebugString
res0: String = (8) ParallelCollectionRDD[0] at parallelize at <console>:24 []

val doubles = nums.map(_ * 2)
scala> doubles.toDebugString
res1: String =
(8) MapPartitionsRDD[1] at map at <console>:25 []
 |  ParallelCollectionRDD[0] at parallelize at <console>:24 []

val groups = doubles.groupBy(_ < 10)
scala> groups.toDebugString
res2: String =
(8) ShuffledRDD[3] at groupBy at <console>:25 []
 +-(8) MapPartitionsRDD[2] at groupBy at <console>:25 []
    |  MapPartitionsRDD[1] at map at <console>:25 []
    |  ParallelCollectionRDD[0] at parallelize at <console>:24 []

Если предположить, что каждое преобразование занимает длительный период для фактического выполнения, то когда можно ... RDD [0] будетвыселили?Это самый ранний момент времени.Дело в том, что ... RDD [0] является родителем для ... RDD [1..N] или родителем для всех таких объектов?Я утверждаю это, как я нашел такое заявление в другом месте.

Я не думаю, что это дубликат, он ищет разъяснения по указанному заявлению.

Моя интерпретация заключается в том, что термин корневой объект подразумевает, что RDD [0] не может подвергаться сборке мусора до тех пор, пока не произойдет действие, или не произойдет кэш или контрольная точка в пути DAG действия.Ищу подтверждения по этому вопросу.Предложение для меня о том, что является корневым объектом, теперь неясно.Я бы подумал, что корневые объекты - это более ранние RDD в цепочке.

1 Ответ

4 голосов
/ 28 апреля 2019

СДР имеет следы памяти различного вида:

1) он использует память на драйвере (как обычный объект)

2) информация об этом СДР распределяется на рабочих

3) если RDD кэшируется, он может выделить дополнительное пространство для рабочих

Когда RDD становится недоступным с точки зрения (1) его очистки (2) и (3) запускается с помощью ContextCleaner.Таким образом, мы говорим только о (1).

Не имеет значения, кэшируется ли RDD или нет.Выполнение таких действий, как count / collect, также не имеет значения.RDD просто умирает как обычный объект Java, когда вы покидаете область видимости, где этот RDD виден.

В вашем конкретном примере RDD1 зависит от RDD0, поэтому последнее не будет выселено, если не будет выселено первое.И RDD1 будет выселено только после RDD2, которое будет выселено только после RDD3.И чтобы разблокировать RDD3 для сборщика мусора, вы должны (смутно говоря) оставить метод, в котором вы его используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...