web-dev-qa-db-fra.com

Augmenter la mémoire disponible pour PySpark lors de l'exécution

J'essaie de créer un programme de recommandation à l'aide de Spark et je viens juste de manquer de mémoire:

Exception in thread "dag-scheduler-event-loop" Java.lang.OutOfMemoryError: Java heap space

J'aimerais augmenter la mémoire disponible pour Spark en modifiant la propriété spark.executor.memory, dans PySpark, à l'exécution.

Est-ce possible? Si c'est le cas, comment?

mettre à jour

inspiré par le lien dans le commentaire de @ zero323, j'ai essayé de supprimer et de recréer le contexte dans PySpark:

del sc
from pyspark import SparkConf, SparkContext
conf = (SparkConf().setMaster("http://hadoop01.woolford.io:7077").setAppName("recommender").set("spark.executor.memory", "2g"))
sc = SparkContext(conf = conf)

revenu:

ValueError: Cannot run multiple SparkContexts at once;

C'est bizarre, car:

>>> sc
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'sc' is not defined
13
Alex Woolford

Vous pouvez définir spark.executor.memory lorsque vous démarrez votre pyspark-Shell

pyspark --num-executors 5 --driver-memory 2g --executor-memory 2g
31
Ha Pham

Je ne sais pas pourquoi vous avez choisi la réponse ci-dessus lorsqu'il est nécessaire de redémarrer votre shell et de l'ouvrir avec une commande différente! Bien que cela fonctionne et soit utile, il existe une solution en ligne qui correspond à ce qui était demandé. C’est essentiellement ce que @ zero323 a mentionné dans les commentaires ci-dessus, mais le lien mène à un article décrivant son implémentation dans Scala. Vous trouverez ci-dessous une implémentation fonctionnelle spécifique à PySpark.

Remarque: le SparkContext pour lequel vous souhaitez modifier les paramètres ne doit pas avoir été démarré, sinon vous devrez le fermer, modifier les paramètres et rouvrir.

from pyspark import SparkContext
SparkContext.setSystemProperty('spark.executor.memory', '2g')
sc = SparkContext("local", "App Name")

source: https://spark.Apache.org/docs/0.8.1/python-programming-guide.html

p.s. si vous avez besoin de fermer SparkContext, utilisez simplement:

SparkContext.stop(sc)

et pour vérifier les paramètres actuels qui ont été définis, vous pouvez utiliser:

sc._conf.getAll()
29
abby sobh

Pour autant que je sache, il ne serait pas possible de changer le spark.executor.memory à l'exécution. Les conteneurs, sur les codes de données, seront créés avant l'initialisation du contexte d'étincelle. 

4
avrsanjay

En citant this , après la version 2.0.0, vous n’aurez plus à utiliser SparkContext, mais SparkSession avec la méthode conf comme ci-dessous:

spark.conf.set("spark.executor.memory", "2g")
0
Gomes