Comment définir la mémoire Apache Spark Executor


128

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

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 défini le fichier à mettre en cache en mémoire, j'obtiens ces erreurs:

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.

Je regardais la documentation ici et mis spark.executor.memoryà 4gen$SPARK_HOME/conf/spark-defaults.conf

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

Cependant, lorsque je vais dans l' onglet Executor, la limite de mémoire pour mon seul Executor est toujours fixée à 265,4 Mo. J'ai également toujours la même erreur.

J'ai essayé diverses choses mentionnées ici mais j'obtiens toujours l'erreur et je n'ai pas d'idée claire de l'endroit où je devrais changer le paramètre.

J'exécute mon code de manière interactive à partir du spark-shell

Réponses:


185

Puisque vous exécutez Spark en mode local, le réglage spark.executor.memoryn'aura aucun effet, comme vous l'avez remarqué. La raison est que les travailleurs « vit » dans le processus pilote JVM que vous démarrez lorsque vous démarrez -shell d'allumage et la mémoire par défaut utilisé pour c'est 512M . Vous pouvez l'augmenter en réglant spark.driver.memorysur quelque chose de plus élevé, par exemple 5g . Vous pouvez le faire soit:

  • le définir dans le fichier de propriétés (par défaut $SPARK_HOME/conf/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 définissant 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 et par défaut, ils sont 0,6 et 0,9.

512 MB * 0.6 * 0.9 ~ 265.4 MB

Sachez donc que la totalité de la mémoire du pilote ne sera pas disponible pour le stockage RDD.

Mais lorsque vous commencerez à l'exécuter sur un cluster, le spark.executor.memoryparamètre prendra le relais lors du calcul du montant à consacrer au cache mémoire de Spark.


1
Est-ce que 5 g équivaut à 5 Go?
Chuck le

@Chuck spark.apache.org/docs/latest/… "Quantité de mémoire à utiliser pour le processus de pilote, c'est-à-dire là où SparkContext est initialisé, au même format que les chaînes de mémoire JVM avec un suffixe d'unité de taille (" k "," m "," g "ou" t ") (par exemple 512 m, 2 g)."
James Moore le

39

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 :

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


5

Apparemment, la question ne dit jamais de fonctionner en mode local et non en fil. D'une manière ou d'une autre, je n'ai pas pu faire fonctionner le changement de spark-default.conf. Au lieu de cela j'ai essayé ça et ça a marché pour moi

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

(Impossible de faire passer la mémoire de l'exécuteur à 8g, il y a une restriction de la configuration du fil.)


Le PO mentionne qu'il utilise une seule machine.
Sharique Abdullah

Vous faites le executor-memoryplus haut que driver-memory?
nimeresam

5

La réponse soumise 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épart, j'obtenais une erreur Java de mémoire insuffisante 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)

4

Vous devez augmenter la mémoire du pilote. Sur mac (c'est-à-dire lors de l'exécution sur un maître local), la mémoire du pilote par défaut est de 1024M). Par défaut, 380 Mo sont donc alloués à l'exécuteur.

Capture d'écran

Lors de l'augmentation de [ --driver-memory 2G ], la mémoire de l'exécuteur a été augmentée à ~ 950 Mo. entrez la description de l'image ici


2

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

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

1
Exactement, je lance le maître avec une configuration concrète, je n'aurais pas besoin d'ajouter des options à chaque fois que j'exécute une commande spark. Mais ce n'est que pour le nœud de cluster, au cas où il serait autonome, le paramètre est SPARK_WORKER_MEMORY.
Evhz

1

Vous pouvez créer 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" 

1

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

La mémoire de l'exécuteur comprend la mémoire requise pour l'exécution des tâches plus la mémoire supplémentaire qui ne doit pas être supérieure à la taille de la JVM 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 sur tous les nœuds du cluster.

Alternativement, nous pouvons passer le cœur de l'exécuteur et la valeur de la mémoire en tant qu'argument lors de l'exécution de la spark-submitcommande avec le chemin de la classe et de 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

vous avez mentionné que vous exécutez votre code de manière interactive sur spark-shell donc, tout en faisant si aucune valeur correcte n'est définie pour la mémoire du pilote ou la mémoire de l'exécuteur, Spark lui attribue par défaut une valeur, qui est basée sur son fichier de propriétés (où la valeur par défaut est é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 fondamentalement deux types d'espace sont requis par le programme spark, donc si vous voulez définir la mémoire du pilote puis au démarrage de 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 à aller avec la valeur souhaitée de la mémoire que vous voulez que votre étincelle utilise.


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

Autant que je sache, il ne serait pas possible de changer le spark.executor.memoryau moment de l'exécution. Si vous exécutez une version autonome, avec pyspark et graphframes, vous pouvez lancer le pyspark REPLen exécutant la commande suivante:

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

Assurez-vous de modifier la SPARK_VERSIONvariable d'environnement de manière appropriée en ce qui concerne la dernière version publiée de Spark

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.