Как установить память Apache Spark Executor

Как увеличить память, доступную для узлов-исполнителей Apache?

У меня есть файл размером 2 ГБ, подходящий для загрузки в Apache Spark. На данный момент я запускаю искру apache на 1 машине, поэтому драйвер и исполнитель находятся на одной машине. Аппарат имеет 8 ГБ памяти.

Когда я пытаюсь подсчитать строки файла после установки файла, который будет кэшироваться в памяти, я получаю следующие ошибки:

2014-10-25 22:25:12 WARN  CacheManager:71 - Not enough space to cache partition rdd_1_1 in memory! Free memory is 278099801 bytes.

Я посмотрел документацию здесь и установил spark.executor.memory в 4g в $SPARK_HOME/conf/spark-defaults.conf

Пользовательский интерфейс показывает, что эта переменная задана в Spark Environment. Вы можете найти скриншот здесь

Однако, когда я перехожу на вкладку Executor, предел памяти для моего единственного Executor по-прежнему установлен на 265,4 МБ. Я также по-прежнему получаю ту же ошибку.

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

Я запускаю свой код в интерактивном режиме из искровой оболочки

Ответ 1

Поскольку вы используете Spark в локальном режиме, установка spark.executor.memory не будет иметь никакого эффекта, как вы заметили. Причиной этого является то, что Работник "живет" в процессе JVM драйвера, который вы запускаете при запуске искровой оболочки, а используемая по умолчанию память - 512 М. Вы можете увеличить это, установив spark.driver.memory на что-то более высокое, например 5g. Вы можете это сделать либо:

  • установив его в файл свойств (по умолчанию - spark-defaults.conf),

    spark.driver.memory              5g
    
  • или путем настройки конфигурации во время выполнения

    $ ./bin/spark-shell --driver-memory 5g
    

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

Причиной 265.4 МБ является то, что Spark посвящает spark.storage.memoryFraction * spark.storage.safetyFraction в общий объем памяти и по умолчанию - 0,6 и 0,9.

512 MB * 0.6 * 0.9 ~ 265.4 MB

Поэтому имейте в виду, что для хранения RDD не будет доступен весь объем памяти драйвера.

Но когда вы начнете запускать это в кластере, параметр spark.executor.memory будет задействован при вычислении суммы, чтобы выделить кеш памяти Spark.

Ответ 2

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

bin/spark-submit --driver-memory 2g --class your.class.here app.jar

Это запустит JVM с 2G вместо 512M по умолчанию.
Подробнее здесь:

Для локального режима у вас есть только один исполнитель, и этот исполнитель - ваш драйвер, поэтому вам нужно установить вместо этого память драйвера. * При этом в локальном режиме к моменту запуска spark-submit JVM уже был запущен с настройками памяти по умолчанию, поэтому установка "spark.driver.memory" в вашем conf фактически ничего не сделает для вас. Вместо этого вам нужно запустить spark-submit следующим образом

Ответ 3

По-видимому, вопрос никогда не говорит, что он работает в локальном режиме, а не на пряже. Так или иначе, я не смог получить работу от spark-default.conf. Вместо этого я попробовал это, и это сработало для меня.

bin/spark-shell --master yarn --num-executors 6  --driver-memory 5g --executor-memory 7g

(can not bump executor-memory to 8g есть некоторое ограничение от конфигурации пряжи.)

Ответ 4

Вам нужно увеличить память драйвера. В Mac (например, при работе на локальном хозяине) память драйвера по умолчанию равна 1024 М). По умолчанию, таким образом, 380 Мб выделяется исполнителю.

Снимок экрана

При увеличении [ - памяти драйвера 2G] память исполнителей увеличилась до ~ 950 МБ. введите описание изображения здесь

Ответ 5

создать файл с именем spark-env.sh в каталоге spark/conf и добавьте эту строку

SPARK_EXECUTOR_MEMORY=2000m #memory size which you want to allocate for the executor

Ответ 6

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

 spark-submit    --jars /usr/share/java/postgresql-jdbc.jar    --class com.examples.WordCount3  /home/vaquarkhan/spark-scala-maven-project-0.0.1-SNAPSHOT.jar --jar  --num-executors 3 --driver-memory 10g **--executor-memory 10g** --executor-cores 1  --master local --deploy-mode client  --name wordcount3 --conf "spark.app.id=wordcount" 

Ответ 7

Память исполнителя Spark требуется для запуска ваших искровых задач на основе инструкций, данных вашей программой драйвера. В основном, это требует больше ресурсов, которые зависят от вашей работы.

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

Добавьте следующие параметры в spark-defaults.conf

spar.executor.cores=1

spark.executor.memory=2g

Если вы используете какие-либо инструменты управления кластером, такие как cloudera manager или amabari, обновите конфигурацию кластера, чтобы отобразить последние настройки для всех узлов кластера.

В качестве альтернативы, мы можем передать ядро исполнителя и значение памяти в качестве аргумента при выполнении команды spark-submit вместе с классом и путем к приложению.

Пример:

spark-submit \

  --class org.apache.spark.examples.SparkPi \

  --master yarn \

  --deploy-mode cluster \  # can be client for client mode

  --executor-memory 2G \

  --num-executors 5 \

  /path/to/examples.jar \

  1000

Ответ 8

вы упомянули, что вы выполняете свой код интерактивно на spark-shell, поэтому, если вы делаете, если для памяти драйвера или памяти исполнителя не задано правильное значение, тогда spark по умолчанию присваивает ему какое-то значение, которое основано на файле свойств (где значение по умолчанию равно упоминается).

Я надеюсь, что вы знаете о том факте, что есть один драйвер (главный узел) и рабочий узел (где создаются и обрабатываются исполнители), так что в основном программе Spark требуется два типа пространства, поэтому, если вы хотите установить Память драйвера тогда при запуске spark-shell.

spark-shell --driver-memory "ваше значение" и для установки памяти исполнителя: spark-shell --executor-memory "ваше значение"

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

Ответ 9

Ответ, предоставленный Грегой, помог мне решить мою проблему. Я запускаю Spark локально из скрипта Python внутри контейнера Docker. Сначала я получал ошибку нехватки памяти Java при обработке некоторых данных в Spark. Тем не менее, я смог выделить больше памяти, добавив следующую строку в мой скрипт:

conf=SparkConf()
conf.set("spark.driver.memory", "4g") 

Вот полный пример скрипта Python, который я использую для запуска Spark:

import os
import sys
import glob

spark_home = '<DIRECTORY WHERE SPARK FILES EXIST>/spark-2.0.0-bin-hadoop2.7/'
driver_home = '<DIRECTORY WHERE DRIVERS EXIST>'

if 'SPARK_HOME' not in os.environ:
    os.environ['SPARK_HOME'] = spark_home 

SPARK_HOME = os.environ['SPARK_HOME']

sys.path.insert(0,os.path.join(SPARK_HOME,"python"))
for lib in glob.glob(os.path.join(SPARK_HOME, "python", "lib", "*.zip")):
    sys.path.insert(0,lib);

from pyspark import SparkContext
from pyspark import SparkConf
from pyspark.sql import SQLContext

conf=SparkConf()
conf.set("spark.executor.memory", "4g")
conf.set("spark.driver.memory", "4g")
conf.set("spark.cores.max", "2")
conf.set("spark.driver.extraClassPath",
    driver_home+'/jdbc/postgresql-9.4-1201-jdbc41.jar:'\
    +driver_home+'/jdbc/clickhouse-jdbc-0.1.52.jar:'\
    +driver_home+'/mongo/mongo-spark-connector_2.11-2.2.3.jar:'\
    +driver_home+'/mongo/mongo-java-driver-3.8.0.jar') 

sc = SparkContext.getOrCreate(conf)

spark = SQLContext(sc)