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
Vous pouvez définir spark.executor.memory
lorsque vous démarrez votre pyspark-Shell
pyspark --num-executors 5 --driver-memory 2g --executor-memory 2g
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()
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.
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")