Як встановити пам'ять Apache Spark Executor


127

Як я можу збільшити пам'ять, доступну для вузлів виконавця іскри 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

Користувацький інтерфейс показує, що ця змінна встановлена ​​в середовищі іскр. Ви можете знайти скріншот тут

Однак, коли я переходжу на вкладку "Виконавець ", межа мого єдиного Виконавця все ще встановлюється в 265,4 Мб. Я також досі отримую ту саму помилку.

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

Я інтерактивно запускаю свій код із іскрової оболонки

Відповіді:


185

Оскільки ви працюєте Spark в локальному режимі, налаштування spark.executor.memoryне матиме жодного ефекту, як ви помітили. Причиною цього є те, що працівник "живе" в процесі JVM драйвера, який ви починаєте, коли ви запускаєте іскрову оболонку, а для цього використовується пам'ять за замовчуванням 512M . Ви можете збільшити це, встановивши spark.driver.memoryщось вище, наприклад . Це можна зробити будь-яким:

  • встановивши його у файлі властивостей (типовим є $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, в тому ж форматі, що і рядки пам'яті віртуальної машини Java з одиничною розмір суфікса (" До «» м "," g "або" t ") (наприклад, 512м, 2г)."
Джеймс Мур

39

Також зауважте, що для локального режиму вам потрібно встановити об'єм пам'яті драйвера перед запуском jvm:

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

Це почне JVM з 2G замість 512 за замовчуванням.
Деталі тут :

У локальному режимі у вас є лише один виконавець, і цей виконавець - ваш драйвер, тому вам потрібно встановити пам'ять драйвера. * Це означає, що в локальному режимі до моменту запуску іскрової подачі вже запущений JVM з налаштуваннями пам'яті за замовчуванням, тому встановлення "spark.driver.memory" у вашому конфлікті насправді нічого не зробить для вас. Замість цього потрібно запустити іскрову подачу наступним чином


5

Мабуть, питання ніколи не говорить про те, щоб працювати в локальному режимі не на пряжі. Якось не міг отримати іскровий default.conf змінити роботу. Натомість я спробував це, і це спрацювало на мене

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

(Не вдалося збільшити пам'ять виконавця до 8 г, існує певне обмеження з конфігурації пряжі.)


ОП згадує, що він використовує одну машину.
Шарік Абдулла

Ви робите 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-пам'яті 2G ] пам'ять виконавця зросла до ~ 950Mb. введіть тут опис зображення


2

створіть файл, який називається spark-env.sh у каталозі spark / conf та додайте цей рядок

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

1
Точно я запускаю майстер із конкретною конфігурацією, мені не потрібно буде додавати параметри кожного разу, коли я виконую команду spark. Але це лише для вузла кластера, на випадок, якщо це окреме налаштування SPARK_WORKER_MEMORY.
Евхз

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

Пам'ять виконавця іскри потрібна для виконання іскрових завдань на основі інструкцій, наданих програмою драйвера. В основному, для цього потрібно більше ресурсів, що залежить від вашої роботи.

Пам'ять виконавця включає в себе пам’ять, необхідну для виконання завдань плюс накладну пам'ять, яка не повинна перевищувати розмір 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-shell - пам'ять "drariver" "ваша цінність" та встановити пам'ять виконавця: 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.