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


128

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

У меня есть файл размером 2 ГБ, который подходит для загрузки в Apache Spark. На данный момент я запускаю apache spark на 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. Вы можете найти скриншот здесь

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

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

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

Ответы:


185

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

  • установка его в файле свойств (по умолчанию $SPARK_HOME/conf/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.


1
5g эквивалентно 5Gb?
Чак

@Chuck spark.apache.org/docs/latest/… "Объем памяти, используемый для процесса драйвера, то есть там, где инициализируется SparkContext, в том же формате, что и строки памяти JVM, с суффиксом единицы размера (" k "," m "," g "или" t ") (например, 512 м, 2 г)".
Джеймс Мур,

39

Также обратите внимание, что для локального режима вы должны установить объем памяти драйвера перед запуском 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 следующим образом


5

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

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

(не удалось увеличить память исполнителя до 8g, есть некоторые ограничения конфигурации пряжи.)


OP упоминает, что он использует одну машину.
Sharique Abdullah

Вы делаете executor-memoryвыше чем driver-memory?
nimeresam

5

Ответ, представленный Грегой, помог мне решить мою проблему. Я запускаю 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)

4

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

Скриншот

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


2

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

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

1
Точно, я запускаю мастер с конкретной конфигурацией, мне не нужно было бы добавлять параметры каждый раз, когда я запускаю команду искры. Но это только для узла кластера, если он автономный, настройка есть SPARK_WORKER_MEMORY.
Evhz

1

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

 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" 

1

Память исполнителя Spark требуется для выполнения ваших задач 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

0

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

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

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

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


0
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


0

Насколько я знаю, во время spark.executor.memoryвыполнения изменить невозможно . Если вы используете автономную версию с pyspark и graphframes, вы можете запустить pyspark REPL, выполнив следующую команду:

pyspark --driver-memory 2g --executor-memory 6g --packages graphframes:graphframes:0.7.0-spark2.4-s_2.11

Обязательно измените SPARK_VERSIONпеременную среды соответствующим образом для последней выпущенной версии Spark.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.