Come impostare la memoria di Apache Spark Executor


127

Come posso aumentare la memoria disponibile per i nodi degli esecutori spark di Apache?

Ho un file da 2 GB adatto al caricamento su Apache Spark. Sto eseguendo Apache Spark per il momento su 1 macchina, quindi il driver e l'esecutore sono sulla stessa macchina. La macchina ha 8 GB di memoria.

Quando provo a contare le righe del file dopo aver impostato il file da memorizzare nella cache, ottengo questi errori:

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.

Ho guardato la documentazione qui e impostare spark.executor.memoryper 4ga$SPARK_HOME/conf/spark-defaults.conf

L'interfaccia utente mostra che questa variabile è impostata nell'ambiente Spark. Puoi trovare lo screenshot qui

Tuttavia, quando vado nella scheda Executor, il limite di memoria per il mio singolo Executor è ancora impostato su 265,4 MB. Ottengo ancora lo stesso errore.

Ho provato varie cose menzionate qui, ma ho ancora l'errore e non ho un'idea chiara di dove dovrei cambiare l'impostazione.

Sto eseguendo il mio codice in modo interattivo dalla spark-shell

Risposte:


185

Dato che stai eseguendo Spark in modalità locale, l'impostazione spark.executor.memorynon avrà alcun effetto, come hai notato. La ragione di ciò è che il lavoratore "vive" all'interno del processo JVM del driver che si avvia quando si avvia spark-shell e la memoria predefinita utilizzata è 512M . Puoi aumentarlo impostando spark.driver.memoryqualcosa di più alto, ad esempio 5g . Puoi farlo sia:

  • impostandolo nel file delle proprietà (impostazione predefinita è $SPARK_HOME/conf/spark-defaults.conf),

    spark.driver.memory              5g
    
  • o fornendo le impostazioni di configurazione in fase di esecuzione

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

Si noti che ciò non può essere ottenuto impostandolo nell'applicazione, poiché ormai è troppo tardi, il processo è già iniziato con una certa quantità di memoria.

Il motivo di 265,4 MB è che Spark dedica spark.storage.memoryFraction * spark.storage.safetyFraction alla quantità totale di memoria di archiviazione e per impostazione predefinita sono 0,6 e 0,9.

512 MB * 0.6 * 0.9 ~ 265.4 MB

Pertanto, tenere presente che non l'intera quantità di memoria del driver sarà disponibile per l'archiviazione RDD.

Ma quando inizierai a eseguirlo su un cluster, l' spark.executor.memoryimpostazione prenderà il sopravvento nel calcolo della quantità da dedicare alla cache di memoria di Spark.


1
5g è equivalente a 5Gb?
Chuck,

@Chuck spark.apache.org/docs/latest/… "Quantità di memoria da utilizzare per il processo del driver, ovvero dove viene inizializzato SparkContext, nello stesso formato delle stringhe di memoria JVM con un suffisso di unità di dimensioni (" k "," m "," g "o" t ") (ad es. 512m, 2g)."
James Moore,

39

Si noti inoltre che per la modalità locale è necessario impostare la quantità di memoria del driver prima di avviare jvm:

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

Questo avvierà la JVM con 2G anziché i 512M predefiniti.
Dettagli qui :

Per la modalità locale hai un solo esecutore e questo esecutore è il tuo driver, quindi devi impostare la memoria del driver. * Detto questo, in modalità locale, quando avvii spark-submit, una JVM è già stata lanciata con le impostazioni di memoria predefinite, quindi l'impostazione "spark.driver.memory" nella tua configurazione non farà davvero nulla per te. Invece, è necessario eseguire spark-submit come segue


5

Apparentemente, la domanda non dice mai di funzionare in modalità locale e non sul filo. In qualche modo non sono riuscito a far funzionare spark-default.conf. Invece ho provato questo e ha funzionato per me

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

(impossibile trasferire la memoria dell'esecutore a 8 g, c'è qualche restrizione dalla configurazione del filo.)


L'OP menziona che sta usando una sola macchina.
Sharique Abdullah,

Fai il executor-memorypiù alto di driver-memory?
nimeresam,

5

La risposta inviata da Grega mi ha aiutato a risolvere il mio problema. Sto eseguendo Spark localmente da uno script Python all'interno di un contenitore Docker. Inizialmente stavo ottenendo un errore di memoria esaurita Java durante l'elaborazione di alcuni dati in Spark. Tuttavia, sono stato in grado di assegnare più memoria aggiungendo la seguente riga al mio script:

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

Ecco un esempio completo dello script Python che utilizzo per avviare 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

È necessario aumentare la memoria del driver. Su Mac (ad esempio quando si esegue su master locale), la memoria del driver predefinita è 1024M). Di default, quindi 380Mb sono assegnati all'esecutore.

Immagine dello schermo

Aumentando [ --driver-memory 2G ], la memoria dell'esecutore viene aumentata a ~ 950Mb. inserisci qui la descrizione dell'immagine


2

creare un file chiamato spark-env.sh nella directory spark / conf e aggiungere questa riga

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

1
Esatto, eseguo il master con configurazione concreta, non avrei bisogno di aggiungere opzioni ogni volta che eseguo un comando spark. Ma questo è solo per il nodo del cluster, nel caso sia indipendente l'impostazione SPARK_WORKER_MEMORY.
Evhz,

1

È possibile creare un comando usando il seguente esempio

 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

La memoria dell'esecutore Spark è necessaria per eseguire le attività Spark in base alle istruzioni fornite dal programma del driver. Fondamentalmente, richiede più risorse che dipendono dal lavoro inviato.

La memoria dell'esecutore include la memoria necessaria per l'esecuzione delle attività più la memoria ambientale che non dovrebbe essere maggiore della dimensione di JVM e della dimensione massima del contenitore del filato.

Aggiungi i seguenti parametri in spark-defaults.conf

spar.executor.cores=1

spark.executor.memory=2g

Se si utilizzano strumenti di gestione dei cluster come cloudera manager o amabari , aggiornare la configurazione del cluster per riflettere le ultime configurazioni su tutti i nodi del cluster.

In alternativa, possiamo passare il core dell'esecutore e il valore della memoria come argomento durante l'esecuzione del spark-submitcomando insieme alla classe e al percorso dell'applicazione.

Esempio:

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

hai detto che stai eseguendo il tuo codice in modo interattivo su spark-shell, quindi, mentre fai se non è impostato alcun valore appropriato per la memoria del driver o della memoria dell'esecutore, allora Spark assegna in modo predefinito un valore ad esso, che si basa sul suo file delle proprietà (dove il valore predefinito è essere menzionato).

Spero che tu sia a conoscenza del fatto che esiste un driver (nodo principale) e un nodo di lavoro (in cui gli esecutori vengono creati ed elaborati), quindi in pratica due tipi di spazio sono richiesti dal programma spark, quindi se vuoi impostare memoria del driver quindi quando si avvia spark-shell.

spark-shell --driver-memory "il tuo valore" e per impostare la memoria dell'esecutore: spark-shell --executor-memory "il tuo valore"

allora penso che tu sia bravo ad andare con il valore desiderato della memoria che vuoi che usi la tua Spark-Shell.


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

Per quanto ne so, non sarebbe possibile modificarlo spark.executor.memoryin fase di esecuzione. Se stai eseguendo una versione autonoma, con pyspark e graphframes, puoi avviare il pyspark REPLeseguendo il comando seguente:

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

Assicurarsi di modificare la SPARK_VERSIONvariabile di ambiente in modo appropriato per quanto riguarda l'ultima versione rilasciata di Spark

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.