web-dev-qa-db-fra.com

Comment définir la mémoire d'Apache Spark Executor

Comment puis-je augmenter la mémoire disponible pour les nœuds exécuteurs d'étincelles Apache?

J'ai un fichier de 2 Go qui convient au chargement dans Apache Spark. J'utilise Apache spark pour le moment sur 1 machine, donc le pilote et l'exécuteur sont sur la même machine. La machine dispose de 8 Go de mémoire. 

Lorsque j'essaie de compter les lignes du fichier après avoir configuré le fichier pour qu'il soit mis en cache en mémoire, j'obtiens les erreurs suivantes:

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.

J'ai regardé la documentation ici et mis spark.executor.memory à 4g dans $SPARK_HOME/conf/spark-defaults.conf

L'interface utilisateur montre que cette variable est définie dans l'environnement Spark. Vous pouvez trouver capture d'écran ici

Cependant, lorsque je vais dans onglet Executor , la limite de mémoire pour mon unique Executor est toujours définie sur 265,4 Mo. J'ai aussi toujours la même erreur. 

J'ai essayé diverses choses mentionnées ici mais je reçois toujours l'erreur et je ne sais pas très bien où je devrais changer le réglage. 

Je lance mon code de manière interactive à partir du spark-shell

97
WillamS

Comme vous utilisez Spark en mode local, le réglage de spark.executor.memory n'aura aucun effet, comme vous l'avez remarqué. La raison en est que le travailleur "vit" dans le processus JVM de pilote que vous démarrez lorsque vous démarrez spark-Shell et que la mémoire utilisée par défaut à cet effet est 512M. Vous pouvez augmenter cela en réglant spark.driver.memory sur quelque chose de plus élevé, par exemple 5g. Vous pouvez le faire soit par:

  • en le définissant dans le fichier de propriétés (par défaut, spark-defaults.conf), 

    spark.driver.memory              5g
    
  • ou en fournissant des paramètres de configuration lors de l'exécution

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

Notez que cela ne peut pas être réalisé en le configurant dans l'application, car il est déjà trop tard, le processus a déjà commencé avec une certaine quantité de mémoire.

La raison de 265,4 Mo est que Spark dédie spark.storage.memoryFraction * spark.storage.safetyFraction à la quantité totale de mémoire de stockage, qui correspond par défaut à 0,6 et 0,9.

512 MB * 0.6 * 0.9 ~ 265.4 MB

Sachez donc que la mémoire du pilote n’est pas entièrement disponible pour le stockage RDD.

Mais lorsque vous commencerez à exécuter ceci sur un cluster, le paramètre spark.executor.memory prendra le relais lors du calcul du montant à dédier dans la mémoire cache de Spark.

153
Grega Kešpret

Notez également que pour le mode local, vous devez définir la quantité de mémoire du pilote avant de démarrer jvm:

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

Cela démarrera la JVM avec 2G au lieu du 512M par défaut.
Détails ici :

En mode local, vous n'avez qu'un seul exécutant, et cet exécuteur est votre pilote. Vous devez donc définir la mémoire du pilote. * Cela dit, en mode local, au moment où vous exécutez spark-submit, une machine virtuelle Java a déjà été lancée avec les paramètres de mémoire par défaut. La définition de "spark.driver.memory" dans votre conf ne fera donc rien. Au lieu de cela, vous devez exécuter spark-submit comme suit

33
Dmitriy Selivanov

Apparemment, la question ne dit jamais de fonctionner en mode local, pas en fil. D'une manière ou d'une autre, je ne pouvais pas obtenir d'étincelle-default.conf changer au travail. Au lieu de cela, j'ai essayé cela et cela a fonctionné pour moi

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

(impossible d'exécuter la mémoire de l'exécutant à 8g, la configuration du fil étant soumise à certaines restrictions.)

2
Somum

Vous devez augmenter la mémoire du pilote. Sur mac (c.-à-d. Lorsqu’il s’exécute sur un maître local), la mémoire pilote par défaut est de 1024 Mo). Par défaut, 380 Mo sont attribués à l'exécuteur.

 Screenshot

Lors de l’augmentation de [--driver-memory 2G], la mémoire de l’exécuteur est passée à ~ 950Mb .  enter image description here

2
Sanchay

crée un fichier appelé spark-env.sh dans le répertoire spark/conf et ajoute cette ligne

SPARK_EXECUTOR_MEMORY=2000m #memory size which you want to allocate for the executor
1
Mohamed Thasin ah

Vous pouvez construire une commande en utilisant l'exemple suivant 

 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" 
0
vaquar khan

La réponse fournie par Grega m'a aidé à résoudre mon problème. J'exécute Spark localement à partir d'un script python dans un conteneur Docker. Au début, je rencontrais une erreur de mémoire insuffisante Java lors du traitement de certaines données dans Spark. Cependant, j'ai pu attribuer plus de mémoire en ajoutant la ligne suivante à mon script:

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

Voici un exemple complet du script python que j'utilise pour démarrer 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)
0
Sarah

vous avez mentionné que vous exécutiez votre code de manière interactive sur spark-Shell. Ainsi, si vous ne définissez pas de valeur appropriée pour la mémoire du pilote ou de la mémoire de l'exécuteur, étincellez lui affectez par défaut une valeur basée sur son fichier de propriétés étant mentionné).

J'espère que vous êtes conscient du fait qu'il existe un pilote (nœud principal) et un nœud de travail (où les exécuteurs sont créés et traités), donc deux types d'espace sont requis par le programme spark. Par conséquent, si vous souhaitez définir mémoire du pilote puis quand démarrez spark-Shell.

spark-Shell --driver-memory "votre valeur" et pour définir la mémoire de l'exécuteur: spark-Shell --executor-memory "votre valeur"

alors je pense que vous êtes prêt à utiliser la valeur de mémoire que vous souhaitez que votre spark-shell utilise.

0
A.Mishra

La mémoire de l'exécutant Spark est nécessaire pour exécuter vos tâches d'allumage en fonction des instructions fournies par votre programme de pilote. Fondamentalement, cela nécessite plus de ressources qui dépendent du travail soumis.

La mémoire de l'exécuteur inclut la mémoire requise pour l'exécution des tâches, ainsi que la mémoire supplémentaire qui ne doit pas dépasser la taille de la machine virtuelle Java et la taille maximale du conteneur de fil. 

Ajoutez les paramètres suivants dans spark-defaults.conf

spar.executor.cores=1

spark.executor.memory=2g

Si vous utilisez des outils de gestion de cluster tels que cloudera manager ou amabari , veuillez actualiser la configuration du cluster pour refléter les dernières configurations à tous les nœuds du cluster.

Alternativement, nous pouvons passer le noyau de l'exécuteur et la valeur de la mémoire en tant qu'argument lors de l'exécution de la commande spark-submit avec le chemin d'accès à la classe et à l'application.

Exemple:

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
Radhakrishnan Rk