Почему сбор большого набора данных происходит успешно после увеличения памяти наверху - PullRequest
0 голосов
/ 27 ноября 2018

intro

В документации Apache Spark я вижу, что память разделена на три группы, которые можно настроить с помощью нескольких параметров.Допустим, у нас есть машина AWS EMR m4.xlarge.На этой машине Yarn имеет максимальный объем памяти, равный 12288 МБ.Используя эти параметры конфигурации:

  • spark. (Исполнитель | драйвер) .memoryOverhead = 0.2
  • spark. (Исполнитель | драйвер) .memory = 10g
  • spark.memory.fraction = 0,6 (по умолчанию)
  • spark.storage.fraction = 0,3 (по умолчанию)

Я получаю:

  • накладные расходы памяти =2G
  • память исполнителя = 10G
    • память выполнения = 3G (spark.executor.memory * spark.memory.fraction * spark.storage.fraction)
    • память хранения = 3G (spark.executor.memory * spark.memory.fraction * spark.storage.fraction)
    • память пользователя =4G (spark.executor.memory * 1-spark.memory.fraction)

Я использую одинаковую конфигурацию как для драйвера, так и для исполнителя.

Прежде всего - правильно ли это вычисление?Эти параметры в порядке?Мне в основном интересно, оставит ли он достаточно оперативной памяти на машине, чтобы f.ex.Демоны YARN не выйдут из строя?

основной вопрос

Что именно хранится в этих областях памяти?

Мне интересно, потому что я делаю довольно большой сбор (создаю карту ~ 1.5G [(Long, Long)]), которую я затем намереваюсь передать всем исполнителям.Когда я выполнил сбор данных без явного указания издержек (по умолчанию 0,1), кластер вышел из строя, контейнеры были убиты YARN за превышение пределов памяти, но с накладными расходами в 0,2 все прошло гладко.Кажется, что моя Карта хранится в служебной информации, но какова цель хранения исполнителя?

Заранее спасибо!

1 Ответ

0 голосов
/ 14 декабря 2018

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

Передаваемые переменные, однако, должны помещаться в executor.memory, на memoryOverhead это, похоже, не влияет.

...