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

Apache Spark не удаляет временные каталоги

После завершения искровой программы во временном каталоге осталось 3 временных каталога. Имена каталогов таковы: spark-2e389487-40cc-4a82-a5c7-353c0feefbb7

Каталоги пусты.

И когда программа Spark запускается в Windows, мгновенный DLL файл также остается в каталоге temp. Имя файла выглядит так: snappy-1.0.4.1-6e117df4-97b6-4d69-bf9d-71c4a627940c-snappyjava

Они создаются каждый раз, когда запускается программа Spark. Таким образом, количество файлов и каталогов продолжает расти.

Как можно удалить их?

Искры версии 1.3.1 с Hadoop 2.6.

UPDATE

Я проследил исходный код искры.

Методы модуля, создающие 3-х временные каталоги, следующие:

  • DiskBlockManager.createLocalDirs
  • HttpFileServer.initialize
  • SparkEnv.sparkFilesDir

Они (в конце концов) вызывают Utils.getOrCreateLocalRootDirs, а затем Utils.createDirectory, который намеренно НЕ маркирует каталог для автоматического удаления.

Комментарий метода createDirectory гласит: "Каталог гарантированно будет вновь создан и не помечен для автоматического удаления. "

Я не знаю, почему они не отмечены. Действительно ли это намеренно?

4b9b3361

Ответ 1

Существует три SPARK_WORKER_OPTS для поддержки очистки папки рабочего приложения, скопированной здесь для дополнительной справки: из Spark Doc

  • spark.worker.cleanup.enabled, значение по умолчанию - false, Включить периодическую очистку рабочих/прикладных каталогов. Обратите внимание, что это влияет только на автономный режим, так как YARN работает по-разному. Очищаются только каталоги остановленных приложений.

  • spark.worker.cleanup.interval, по умолчанию - 1800, т.е. 30 минут, контролирует интервал в секундах, в течение которого рабочий очищает старые рабочие документы приложения на локальной машине.

  • spark.worker.cleanup.appDataTtl, по умолчанию 7 * 24 * 3600 (7 дней), количество секунд для сохранения рабочих каталогов приложений для каждого рабочего. Это время для жизни и должно зависеть от объема доступного дискового пространства. Журналы приложений и банки загружаются в каждый каталог работы приложения. Со временем рабочие ряды могут быстро заполнить дисковое пространство, особенно если вы выполняете задания очень часто.

Ответ 2

Я предполагаю, что вы используете "локальный" режим только для целей тестирования. Я решил эту проблему, создав специальную временную папку перед запуском теста, а затем удаляю ее вручную (в моем случае я использую локальный режим в JUnit, поэтому временная папка автоматически удаляется).

Вы можете изменить путь к папке temp для Spark по свойству spark.local.dir.

SparkConf conf = new SparkConf().setMaster("local")
                                .setAppName("test")
                                .set("spark.local.dir", "/tmp/spark-temp");

После завершения теста я удалю папку /tmp/spark-temp вручную.

Ответ 3

Я не знаю, как сделать Spark очисткой этих временных каталогов, но я смог предотвратить создание файлов snappy-XXX. Это можно сделать двумя способами:

  • Отключить сжатие. Свойства: spark.broadcast.compress, spark.shuffle.compress, spark.shuffle.spill.compress. См. http://spark.apache.org/docs/1.3.1/configuration.html#compression-and-serialization
  • Используйте LZF в качестве кодека сжатия. Spark использует собственные библиотеки для Snappy и lz4. И из-за того, как JNI работает, Spark должен распаковать эти библиотеки перед их использованием. LZF, по-видимому, реализуется изначально на Java.

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

Ответ 4

Я не думаю, что очистка поддерживается для всех сценариев. Я бы посоветовал написать простой планировщик окон, чтобы очистить ночную жизнь.

Ответ 5

Вам нужно вызвать функцию close() в контексте искры, созданную вами в конце программы.