Dans Pyspark, je peux créer un RDD à partir d'une liste et décider du nombre de partitions à avoir:
sc = SparkContext()
sc.parallelize(xrange(0, 10), 4)
Comment le nombre de partitions que je décide de partitionner mon RDD influence-t-il les performances? Et comment cela dépend-il du nombre de cœurs de ma machine?
Le principal effet serait de spécifier trop peu de partitions ou loin trop de partitions.
Trop peu de partitions Vous n'utiliserez pas tous les cœurs disponibles dans le cluster.
Trop de partitions Il y aura une surcharge excessive dans la gestion de nombreuses petites tâches.
Entre les deux, le premier a beaucoup plus d'impact sur les performances. Planifier trop de petites tâches est un impact relativement faible à ce stade pour les nombres de partitions inférieurs à 1000. Si vous avez de l'ordre de dizaines de milliers de partitions, alors spark obtient très lent.
Pour ajouter à l'excellente réponse de javadba, je me souviens que les docs recommandent que votre nombre de partitions soit défini à 3 ou 4 fois le nombre de cœurs de processeur dans votre cluster afin que le travail soit réparti plus uniformément entre les cœurs de processeur disponibles. Cela signifie que si vous n'avez qu'une partition par cœur de processeur dans le cluster, vous devrez attendre la fin de la tâche la plus longue, mais si vous l'aviez décomposée davantage, la charge de travail serait plus équilibrée avec des tâches rapides et lentes en soirée. .
nombre de partitions a un impact élevé sur les performances du code spark. Idéalement, la partition spark implique la quantité de données que vous souhaitez mélanger. Normalement, vous devez définir ce paramètre sur votre shuffle size (shuffle read write) et que vous pouvez décider et le nombre de partition à 128 à 256 Mo par partition pour gagner des performances maximales.
Vous pouvez définir la partition dans votre code spark sql en définissant la propriété comme suit: spark.sql.shuffle.partitions ou tout en utilisant n'importe quel cadre de données, vous pouvez le définir par belo: df.repartition (numOfPartitions)