mon cas d'utilisation comme mentionné ci-dessous. p>
Le problème que je suis confronté ici est de décider du nombre de partitions à appliquer sur les données d'entrée. La taille des données d'entrée varie à chaque fois que le code de codage est une valeur particulière n'est pas une option. et Spark effectue très bien que lorsque certaines partitions optimales sont appliquées sur les données d'entrée pour lesquelles je dois effectuer beaucoup d'itération (essais et erreurs). Qui n'est pas une option dans un environnement de production. Strong> p>
Ma question: Existe-t-il une règle de pouce pour décider du nombre de partitions requises en fonction de la taille des données d'entrée et des ressources de cluster disponibles (exécuteurs, cœurs, etc.)? Si oui, veuillez me pointer dans cette direction. Toute aide est très appréciée. P>
J'utilise Spark 1.0 sur le fil. P>
merci,
AG P>
3 Réponses :
Détermination du nombre de partitions est un peu délicat. Spark par défaut tentera de déduire un nombre sensible de partitions. Remarque: Si vous utilisez la méthode TextFile avec du texte comprimé, l'étincelle désactivera la division, puis vous devrez re-partition (on dirait que cela pourrait être ce qui se passe peut-être?). Avec des données non compressées Lorsque vous chargez avec SC.TextFile, vous pouvez également spécifier un nombre de cloisons de minium (par exemple, MinPartitions)). P>
La fonction de regroupement n'est utilisée que pour réduire le nombre de partitions. Vous devez donc envisager d'utiliser la fonction Repartition (). P>
En ce qui concerne le choix d'un "bon" numéro, vous voulez généralement au moins au moins au moins que le nombre d'exécutants pour le parallélisme. Il existe déjà une logique pour essayer de déterminer une "bonne" quantité de parallélisme, et vous pouvez obtenir cette valeur en appelant SC.DefaultParallelism P>
Je suppose que vous connaissez la taille du groupe entrant, Ensuite, vous pouvez essentiellement essayer de partitionner les données dans certains multiples de Qu'il s'agisse de plonger de gamme pour partitionner les données à peu près également. Dynamique Les partitions sont créées en fonction du nombre de blocs sur le système de fichiers et d'où la Tâche surcharge de planification de tant de tâches tue principalement la performance.
import org.apache.spark.RangePartitioner; var file=sc.textFile("<my local path>") var partitionedFile=file.map(x=>(x,1)) var data= partitionedFile.partitionBy(new RangePartitioner(3, partitionedFile))
Deux notes de Tuning Spark dans la documentation officielle Spark: P >
1- En général, nous recommandons 2-3 tâches par noyau CPU dans votre cluster. P>
2- Spark peut supporter efficacement les tâches comme étant courtes que 200 ms, car elle réutilise un exécutoire JVM dans de nombreuses tâches et qu'il a un coût de lancement de tâches à faible tâche, de sorte que vous puissiez augmenter le niveau de parallélisme à plus du nombre de cœurs. dans vos grappes. p> blockQuote>
Ce sont deux règles de Tumb qui vous aident à estimer le nombre et la taille des partitions. Donc, il vaut mieux avoir de petites tâches (cela pourrait être complété dans cent MS). P>