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
à 4g
en$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
la source
Notez également que pour le mode local, vous devez définir la quantité de mémoire du pilote avant de démarrer jvm:
Cela démarrera la JVM avec 2G au lieu du 512M par défaut.
Détails ici :
la source
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
(Impossible de faire passer la mémoire de l'exécuteur à 8g, il y a une restriction de la configuration du fil.)
la source
executor-memory
plus haut quedriver-memory
?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:
Voici un exemple complet du script python que j'utilise pour démarrer Spark:
la source
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.
Lors de l'augmentation de [ --driver-memory 2G ], la mémoire de l'exécuteur a été augmentée à ~ 950 Mo.
la source
créez un fichier appelé spark-env.sh dans le répertoire spark / conf et ajoutez cette ligne
la source
SPARK_WORKER_MEMORY
.Vous pouvez créer une commande en utilisant l'exemple suivant
la source
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
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-submit
commande avec le chemin de la classe et de l'application.Exemple:
la source
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.
la source
la source
Sous Windows ou Linux, vous pouvez utiliser cette commande:
la source
Autant que je sache, il ne serait pas possible de changer le
spark.executor.memory
au moment de l'exécution. Si vous exécutez une version autonome, avec pyspark et graphframes, vous pouvez lancer le pysparkREPL
en exécutant la commande suivante:Assurez-vous de modifier la
SPARK_VERSION
variable d'environnement de manière appropriée en ce qui concerne la dernière version publiée de Sparkla source