web-dev-qa-db-fra.com

Spark Mémoire du pilote et mémoire de l'exécuteur

Je suis débutant pour Spark et j'exécute mon application pour lire les données de 14 Ko du texte déposé, faire des transformations et des actions (collecter, collectAsMap) et enregistrer les données dans la base de données

Je l'exécute localement dans mon macbook avec une mémoire 16G, avec 8 cœurs logiques.

Le tas Java Max est défini sur 12G.

Voici la commande que j'utilise pour exécuter l'application.

bin/spark-submit --class com.myapp.application --master local [*] --executor-memory 2G --driver-memory 4G /jars/application.jar

Je reçois l'avertissement suivant

13-01-2017 16: 57: 31.579 [Lancer la tâche de l'exécuteur ouvrier-8hread] WARN org.Apache.spark.storage.MemoryStore - Pas assez d'espace pour mettre en cache rdd_57_0 en mémoire! (calculé 26,4 Mo jusqu'à présent)

Quelqu'un peut-il me guider sur ce qui ne va pas ici et comment puis-je améliorer les performances? Aussi comment optimiser le déversement suffle? Voici une vue du déversement qui se produit dans mon système local

enter image description here

8
nnc

L'exécution d'exécuteurs avec trop de mémoire entraîne souvent des retards excessifs de collecte des ordures. Ce n'est donc pas une bonne idée d'attribuer plus de mémoire. Étant donné que vous n'avez que 14 Ko de données, 2 Go de mémoire d'exécuteurs et 4 Go de mémoire de pilote sont plus que suffisants. Il est inutile d'affecter autant de mémoire. Vous pouvez exécuter ce travail avec même 100 Mo de mémoire et les performances seront meilleures que 2 Go.

La mémoire du pilote est plus utile lorsque vous exécutez l'application, en mode cluster de fils, car le maître de l'application exécute le pilote. Ici, vous exécutez votre application en mode local driver-memory n'est pas nécessaire. Vous pouvez supprimer cette configuration de votre travail.

Dans votre candidature, vous avez attribué

Java Max heap is set at: 12G.
executor-memory: 2G 
driver-memory: 4G

Allocation totale de mémoire = 16 Go et votre macbook ayant seulement 16 Go de mémoire. Ici, vous avez alloué le total de votre mémoire RAM) à votre application spark.

Ce n'est pas bien. Le système d'exploitation lui-même consomme environ 1 Go de mémoire et vous pourriez avoir à exécuter d'autres applications qui consomment également la mémoire RAM. Donc ici, vous allouez réellement plus de mémoire que vous n'en avez. Et c'est la cause première de votre l'application génère une erreur Not enough space to cache the RDD

  1. Il est inutile d'affecter Java Heap à 12 Go. Vous devez le réduire à 4 Go ou moins.
  2. Réduisez la mémoire de l'exécuteur à executor-memory 1G ou moins
  3. Puisque vous exécutez localement, supprimez driver-memory à partir de votre configuration.

Soumettez votre travail. Il se déroulera sans problème.

Si vous êtes très désireux de connaître les techniques de gestion de la mémoire spark $), consultez cet article utile.

Spark sur l'allocation des ressources de l'exécuteur de fil

8
Sandeep Singh