Как установить память 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)