Память драйвера Spark и память исполнителя

Я новичок в Spark, и я запускаю свое приложение для чтения данных размером 14 КБ из текстового поля, выполнения некоторых преобразований и действий (сбор, сбор AsMap) и сохранения данных в базе данных.

Я запускаю его локально на своем макбуке с 16 ГБ памяти и 8 логическими ядрами.

Для кучи Java Max установлено значение 12G.

Вот команда, которую я использую для запуска приложения.

bin/spark-submit --class com.myapp.application --master local[*] --executor-memory 2G --driver-memory 4G /jars/application.jar

Я получаю следующее предупреждение

13.01.2017, 16:57:31.579 [Исполнитель задачи запуска worker-8hread] ПРЕДУПРЕЖДЕНИЕ org.apache.spark.storage.MemoryStore — Недостаточно места для кэширования rdd_57_0 в памяти! (на данный момент рассчитано 26,4 МБ)

Может ли кто-нибудь указать мне, что здесь происходит не так и как я могу улучшить производительность? Также как оптимизировать suffle-spill ? Вот вид разлива, который происходит в моей локальной системе

введите описание изображения здесь


person nnc    schedule 14.01.2017    source источник
comment
В локальном режиме spark.executor.memory не действует. так что просто попробуйте spark.driver.memory больше 6 г, так как у вас 16 г оперативной памяти.   -  person Rajat Mishra    schedule 14.01.2017
comment
каков размер файла, который вы пытаетесь прочитать?   -  person Rajat Mishra    schedule 14.01.2017
comment
@RajatMishra Я пробовал с 6 г памяти драйвера и максимальной кучей Java 8 г. Я все еще получаю то же сообщение.   -  person nnc    schedule 16.01.2017


Ответы (2)


Запуск исполнителей со слишком большим объемом памяти часто приводит к чрезмерным задержкам сборки мусора. Поэтому не стоит выделять больше памяти. Поскольку у вас есть только 14 КБ данных, 2 ГБ памяти исполнителей и 4 ГБ памяти драйверов более чем достаточно. Нет смысла выделять столько памяти. Вы можете запустить это задание даже с 100 МБ памяти, и производительность будет выше, чем с 2 ГБ.

Память драйвера более полезна, когда вы запускаете приложение в режиме кластера пряжи, потому что мастер приложения запускает драйвер. Здесь вы запускаете свое приложение в локальном режиме driver-memory не нужно. Вы можете удалить эту конфигурацию из своей работы.

В своем приложении вы назначили

Java Max heap is set at: 12G.
executor-memory: 2G 
driver-memory: 4G

Общий объем памяти = 16 ГБ, а у вашего MacBook только 16 ГБ памяти. Здесь вы выделили общий объем оперативной памяти для вашего приложения spark.

Это не хорошо. Сама операционная система потребляет около 1 ГБ памяти, и у вас могут быть запущены другие приложения, которые также используют оперативную память. Итак, здесь вы фактически выделяете больше памяти, чем у вас есть. И это основная причина того, что ваше приложение выдает ошибку Not enough space to cache the RDD

  1. Назначать Java Heap 12 ГБ бесполезно. Вам нужно уменьшить его до 4 ГБ или меньше.
  2. Уменьшите память исполнителя до executor-memory 1G или меньше
  3. Поскольку вы работаете локально, удалите driver-memory из своей конфигурации.

Отправьте свою работу. Он будет работать гладко.

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

Искра при распределении ресурсов исполнителя пряжи

person Sandeep Singh    schedule 14.01.2017
comment
Поскольку приложение запускается в локальном режиме, не думаете ли вы, что память исполнителя не имеет никакого эффекта, поскольку рабочий процесс находится внутри процесса jvm драйвера? - person Rajat Mishra; 14.01.2017
comment
@RajatMishra Да !! Вы правы, кажется, executor-memory в локальном режиме бесполезна. Я проведу еще несколько тестов и соответствующим образом обновлю свой ответ :) - person Sandeep Singh; 14.01.2017
comment
У кого-нибудь есть источник по управлению памятью в Spark 2.0+, я не нашел ничего похожего на отличный источник, который вы предоставили. Спасибо - person Boern; 06.03.2017

В локальном режиме вам не нужно указывать мастер, можно использовать аргументы по умолчанию. На официальном веб-сайте говорится: «Сценарий spark-submit в каталоге bin Spark используется для запуска приложений в кластере. Он может использовать все поддерживаемые Spark менеджеры кластеров через единый интерфейс, поэтому вам не нужно специально настраивать приложение для каждого из них. one.». Так что вам лучше использовать spark-submit в кластере, локально вы можете использовать spark-shell.

person Wang    schedule 14.01.2017
comment
С помощью spark-shell вы можете отлаживать свое приложение, чтобы определить, какой шаг неверен. - person Wang; 14.01.2017