Функционально вам ничего не нужно делать на RDD или родительских RDD, поскольку, когда они больше не нужны - они будут - как объекты Java - сборщик мусора.Существует объект ContextCleaner, которому назначена эта роль в Spark.
Если приложение Spark завершает работу или завершается действие, на котором основаны эти RDD, то ContextCleaner очистит их, или вы можете использовать операцию unpersist, чтобы сделать это явно, как вы намекаете.Я не уверен, что буду беспокоиться, потому что нужно быть осторожным;Я также читал блог о некоторых побочных эффектах: https://medium.com/lookout-engineering/apache-spark-pitfalls-rdd-unpersist-568f9350fe1d.
Цитата из других источников: СДР - это объект, как и любой другой.Если вы не сохраните / не сохраните его в кеш-памяти, он будет действовать так же, как любой другой объект в управляемом языке, и будет собираться, если на него нет живых корневых объектов.
Это означает, что если выиметь rdd1 -> rdd2 -> rdd3 через карты, тогда, когда действие, применяемое к rdd3, завершено или задание падает и не может восстановиться, это сигнал для ContextCleaner - всякий раз, когда он в следующий раз подходит к нему - для сбора мусораразделы и RDD, начиная с rdd3 и затем работая в обратном направлении.Например, rdd2 не может быть выселен, если rdd3 еще не выселен.
В таком случае: родительские кадры данных могут задерживаться в «кэше», даже если они не были явно кэшированы / сохранены, поскольку Spark необходимо сохранять промежуточные результаты в результате вычислений и т. Д. Для возможного повторного вычисления через DAGбла бла бла
И, более того, Spark Context Cleaner отслеживает использование кэша, хранилища, используемого в конвейерах данных на каждом узле, и отбрасывает старые разделы данных на основе наименьшего количества использовавшихся ранее (LRU), независимо от явного кэширования или нет.
Если вы хотите вручную удалить RDD, а не ждать, пока он не выпадет, с помощью ContextCleaner, решив это, можно использовать метод RDD.unpersist (), но в правильном расположении кода.