web-dev-qa-db-fra.com

Comment optimiser le déversement aléatoire dans Apache Spark application

J'exécute une application de streaming Spark avec 2 travailleurs. L'application a une jointure et une opération syndicale.

Tous les lots se terminent avec succès, mais ont remarqué que les métriques de mélange aléatoire ne sont pas cohérentes avec la taille des données d'entrée ou la taille des données de sortie (la mémoire de déversement est plus de 20 fois).

Veuillez trouver les détails de l'étape spark dans l'image ci-dessous: enter image description here

Après des recherches à ce sujet, a constaté que

Le déversement aléatoire se produit lorsqu'il n'y a pas suffisamment de mémoire pour les données aléatoires.

Shuffle spill (memory) - taille de la forme désérialisée des données en mémoire au moment du déversement

shuffle spill (disk) - taille de la forme sérialisée des données sur le disque après le déversement

Étant donné que les données désérialisées occupent plus d'espace que les données sérialisées. Ainsi, Shuffle spill (memory) est plus.

A remarqué que cela la taille de la mémoire de déversement est incroyablement grande avec de grandes données d'entrée.

Mes requêtes sont:

Ce déversement affecte-t-il considérablement les performances?

Comment optimiser ce débordement de mémoire et de disque?

Existe-t-il des propriétés Spark qui peuvent réduire/contrôler cet énorme déversement?

36
Vijay Innamuri

Apprendre à optimiser les performances Spark nécessite un peu d'investigation et d'apprentissage. Il existe quelques bonnes ressources, notamment cette vidéo . Spark = 1.4 a de meilleurs diagnostics et visualisation dans l'interface qui peuvent vous aider.

En résumé, vous renversez lorsque la taille des partitions RDD à la fin de l'étape dépasse la quantité de mémoire disponible pour le tampon aléatoire.

Vous pouvez:

  1. Manuellement repartition() votre étape précédente afin que vous ayez des partitions plus petites en entrée.
  2. Augmentez le tampon de lecture aléatoire en augmentant la mémoire dans vos processus exécuteurs (spark.executor.memory)
  3. Augmentez le tampon de lecture aléatoire en augmentant la fraction de mémoire exécuteur qui lui est allouée (spark.shuffle.memoryFraction) de la valeur par défaut de 0,2. Vous devez redonner spark.storage.memoryFraction.
  4. Augmentez le tampon de lecture aléatoire par thread en réduisant le rapport des threads de travail (SPARK_WORKER_CORES) à la mémoire de l'exécuteur

S'il y a une écoute experte, j'aimerais en savoir plus sur la façon dont les paramètres memoryFraction interagissent et leur plage raisonnable.

48
Alister Lee