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