Je suis confus quant à la gestion de la mémoire de l'exécuteur et de la mémoire du pilote dans Spark.
Mes paramètres d'environnement sont les suivants:
Entrer des informations sur les données:
Pour un développement simple, j'ai exécuté mon Python en mode cluster autonome (8 travailleurs, 20 cœurs, 45,3 G de mémoire) avec spark-submit
. Maintenant, je voudrais définir la mémoire de l'exécuteur ou la mémoire du pilote pour le réglage des performances.
D'après la documentation Spark , la définition de la mémoire de l'exécuteur est
Quantité de mémoire à utiliser par processus exécuteur, au même format que les chaînes de mémoire JVM (par exemple 512 m, 2 g).
Et la mémoire du pilote?
La mémoire que vous devez affecter au pilote dépend du travail.
Si le travail est basé uniquement sur des transformations et se termine sur une action de sortie distribuée comme rdd.saveAsTextFile, rdd.saveToCassandra, ... alors les besoins en mémoire du pilote seront très faibles. Peu de 100 de MB suffiront. Le conducteur est également responsable de la livraison des fichiers et de la collecte des métriques, mais ne doit pas être impliqué dans le traitement des données.
Si le travail nécessite que le conducteur participe au calcul, comme par ex. certains algo ML qui doivent matérialiser les résultats et les diffuser à la prochaine itération, puis votre travail dépend de la quantité de données passant par le pilote. Opérations comme .collect
, .take
et takeSample
fournissent des données au pilote et, par conséquent, le pilote a besoin de suffisamment de mémoire pour allouer ces données.
par exemple. Si vous avez un rdd
de 3 Go dans le cluster et appelez val myresultArray = rdd.collect
, vous aurez alors besoin de 3 Go de mémoire dans le pilote pour contenir ces données ainsi que de l'espace supplémentaire pour les fonctions mentionnées dans le premier paragraphe.
Dans une application Spark, Driver est responsable de la planification des tâches et Executor est responsable de l'exécution des tâches concrètes de votre travail.
Si vous êtes familier avec MapReduce, vos tâches de carte et tâches de réduction sont toutes exécutées dans Executor (dans Spark, elles s'appellent ShuffleMapTasks & ResultTasks), et aussi, le RDD que vous souhaitez mettre en cache se trouve également dans le tas et le disque de la JVM de l'exécuteur.
Je pense donc que quelques Go seront tout simplement OK pour votre pilote.