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:
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?
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:
repartition()
votre étape précédente afin que vous ayez des partitions plus petites en entrée.spark.executor.memory
)spark.shuffle.memoryFraction
) de la valeur par défaut de 0,2. Vous devez redonner spark.storage.memoryFraction
.SPARK_WORKER_CORES
) à la mémoire de l'exécuteurS'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.