Подтвердить что ты не робот

Будет ли Spark нести себя само RDD, когда он поймет, что он больше не будет использоваться?

Мы можем сохранять RDD в память и/или диск, когда хотим использовать его более одного раза. Тем не менее, нужно ли нам в дальнейшем отказаться от этого, или Spark делает какую-то сборку мусора и не поддерживает RDD, когда он больше не нужен? Я замечаю, что если я сам вызываю функцию непервиста, я получаю более медленную производительность.

4b9b3361

Ответ 1

Да, Apache Spark отменит RDD при сборе мусора.

В RDD.persist вы можете увидеть:

sc.cleaner.foreach(_.registerRDDForCleanup(this))

Это помещает WeakReference в RDD в ReferenceQueue, приводя к ContextCleaner.doCleanupRDD, когда RDD собирает мусор. И там:

sc.unpersistRDD(rddId, blocking)

Для получения дополнительной информации см. ContextCleaner в целом и commit, который добавил его.

Несколько вещей, о которых нужно знать, когда полагаетесь на сборку мусора для неуправляемых RDD:

  • RDD используют ресурсы для исполнителей, а сборка мусора происходит в драйвере. RDD не будет автоматически отключен до тех пор, пока на драйвере не будет достаточного давления на память, независимо от того, насколько полно заполняется диск/память исполнителей.
  • Вы не можете отменить часть RDD (некоторые разделы/записи). Если вы создадите один постоянный RDD из другого, то оба должны будут полностью соответствовать исполнителям одновременно.

Ответ 2

Как отметил @Daniel, Spark удалит разделы из кеша. Это произойдет, когда памяти больше нет, и будет выполнено с использованием алгоритма, используемого по крайней мере недавно. Это не умная система, о чем указывает @eliasah.

Если вы не кэшируете слишком много объектов, вам не нужно беспокоиться об этом. Если вы кешируете слишком много объектов, время сбора JVM станет чрезмерным, поэтому рекомендуется в этом случае отменить их.