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

Почему сбой "Нет места на устройстве", но df говорит иначе?

При выполнении тасования моя работа Spark завершается с ошибкой и говорит "нет места на устройстве", но когда я запускаю df -h, он говорит, что у меня осталось свободное место! Почему это происходит, и как я могу его исправить?

4b9b3361

Ответ 1

Вам нужно также отслеживать df -i, который показывает, сколько inode используется.

на каждой машине мы создаем временные файлы M * R для перетасовки, где M = количество задач карты, R = количество задач сокращения.

https://spark-project.atlassian.net/browse/SPARK-751

Если вы действительно видите, что на диске заканчивается inodes, чтобы устранить проблему, вы можете:

  • Уменьшить разделы (см. coalesce с помощью shuffle = false).
  • Можно отбросить число до O (R) путем "объединения файлов". Поскольку разные файловые системы ведут себя по-разному, рекомендуется прочитать на spark.shuffle.consolidateFiles и посмотреть https://spark-project.atlassian.net/secure/attachment/10600/Consolidating%20Shuffle%20Files%20in%20Spark.pdf.
  • Иногда вы можете просто найти, что вам нужен DevOps, чтобы увеличить количество индексов, поддерживаемых FS.

ИЗМЕНИТЬ

Консолидация файлов была удалена из искры с версии 1.6. https://issues.apache.org/jira/browse/SPARK-9808

Ответ 2

По умолчанию Spark использует каталог /tmp для хранения промежуточных данных. Если на каком-то устройстве у вас действительно осталось место, вы можете изменить это, создав файл SPARK_HOME/conf/spark-defaults.conf и добавив строку. Здесь SPARK_HOME находится везде, где вы корневой каталог для искровой установки.

spark.local.dir                     SOME/DIR/WHERE/YOU/HAVE/SPACE

Ответ 3

Я столкнулся с аналогичной проблемой. По умолчанию искра использует "/tmp" для сохранения промежуточных файлов. Когда работа выполняется, вы можете вставить вкладку "df -h", чтобы увидеть использованное пространство fs, установленное на "/", растущем. Когда пространство разработчика отключается, это исключение выбрасывается. Чтобы решить проблему, я установил SPARK_LOCAL_DIRS в SPARK_HOME/conf/spark_defaults.conf с путём в fs, оставляя достаточно места.

Ответ 4

Некоторые другие обходные пути:

  • Явное удаление файлов промежуточного shuffe. Если вы не хотите чтобы сохранить rdd для последующего вычисления, вы можете вызвать .unpersist() который будет помечать файлы промежуточного тасования для удаления (вы можете также переустановите переменную rdd в None).

  • Используйте больше работников, добавив больше работников, в среднем уменьшится количество файлов с промежуточным достаточным файлом/рабочий.

Подробнее о ошибке "Нет места на устройстве" в этом потоке данных: https://forums.databricks.com/questions/277/how-do-i-avoid-the-no-space-left-on-device-error.html

Ответ 5

Другой сценарий для этой ошибки:

  • У меня есть искровое задание, которое использует два источника данных (~ 150 ГБ и ~ 100 ГБ) и выполняет внутреннее соединение, многие операции группирования, фильтрации и отображения.
  • Я создал 20-разрядный (r3.2xlarge) искровой кластер с использованием сценариев искривления ec-2

Проблема:

Ошибка выполнения моей работы "На устройстве нет места" . Поскольку вы можете видеть, что моя работа требует так много перетасовки, поэтому, чтобы противостоять этой проблеме, я использовал 20-узлов, а затем увеличен до 40 узлов. Как-то проблема все еще продолжалась. Я пробовал все другие вещи, такие как изменение spark.local.dir, переделка, пользовательские разделы и настройка параметров (сжатие, переплетение, память, доля памяти и т.д.), Насколько я мог это сделать. Кроме того, я использовал экземпляр типа r3.2xlarge, который имеет 1 x 160 SSD, но проблема все еще происходит.

Решение

Я вошел в один из узлов и выполнил "df -h/" . Я обнаружил, что node имеет только один смонтированный том EBS (8 ГБ), но SSD (160 ГБ) отсутствует. Затем я просмотрел "ls/dev/" и SSD был прикреплен. Эта проблема не выполнялась для всех узлов в кластере. Ошибка "Отсутствие места на устройстве" происходит только для тех узлов, на которых нет SSD. Поскольку они имеют дело только с 8 ГБ (EBS) и из этого ~ 4 ГБ пространства было доступно.

Я создал еще один bash script, который запускает искровой кластер с помощью spark-ec2 script, затем смонтирует диск после его форматирования.

  • ec2- script для запуска кластера
  • MASTER_HOST = get-master $CLUSTER_NAME
  • ssh -o StrictHostKeyChecking = no root @$MASTER_HOST "cd/root/spark/sbin/&./slaves.sh mkfs.ext4 -E lazy_itable_init = 0, lazy_journal_init = 0/dev/sdb && & && & & &../slaves.sh mount -o defaults, noatime, nodiratime/dev/sdb/mnt"

Ответ 6

Пожалуйста, измените каталог SPARK_HOME, так как мы должны предоставить каталог, у которого больше свободного места для бесперебойной работы нашей работы.