2016-04-17 1 views
10

Je ne comprends pas tout à fait le paramètre spark.task.cpus. Il me semble qu'une «tâche» correspond à un «fil» ou un «processus», si vous voulez, au sein de l'exécuteur. Supposons que je mets "spark.task.cpus" à 2.Nombre de processeurs par tâche dans Spark

  1. Comment un thread peut-il utiliser deux processeurs simultanément? Ne pourrait-il pas exiger des verrous et causer des problèmes de synchronisation? Je regarde launchTask() fonction dans deploy/executor/Executor.scala, et je ne vois aucune notion de "nombre de processeurs par tâche" ici. Alors, où/comment Spark finit par allouer plus d'un CPU à une tâche en mode autonome?

Répondre

10

Au meilleur de ma connaissance spark.task.cpus contrôle le parallélisme des tâches que vous cluster dans le cas où certaines tâches particulières sont connus pour avoir leur propre parallélisme interne (sur mesure).

De façon plus détaillée: Nous savons que spark.cores.max définit le nombre de threads (aka cœurs) vos besoins d'application. Si vous laissez spark.task.cpus = 1 alors vous aurez # nombre spark.cores.max de tâches Spark simultanées s'exécutant en même temps.

Vous voulez seulement changer spark.task.cpus si vous savez que sont eux-mêmes vos tâches parallélisée (peut-être chacun de votre tâche engendre deux fils, interagit avec des outils externes, etc.) En définissant spark.task.cpus en conséquence, vous devenez un bon « citoyen » . Maintenant, si vous avez spark.cores.max = 10 et spark.task.cpus = 2 Spark ne créera que 10/2 = 5 tâches simultanées. Étant donné que vos tâches nécessitent (disons) 2 threads en interne, le nombre total de threads en cours d'exécution ne sera jamais supérieur à 10. Cela signifie que vous ne dépasserez jamais votre contrat initial (défini par spark.cores.max).

+4

J'ajouterais qu'il est utilisé partout dans la source comme 'CPUS_PER_TASK' bien qu'il ne soit pas vraiment appliqué à l'exécution (plus d'indication d'utilisation des ressources qu'une limitation stricte) – zero323

+0

avez-vous un exemple montrant comment une tâche peut être parallélisée en interne ? Le CPUS_PER_TASK est utilisé dans une planification de très haut niveau, il n'est jamais transmis à l'exécuteur. Donc, ma question est "comment nous assurons-nous qu'une tâche obtient les cœurs spark.task.cpus qu'elle a demandés?" – smz

+1

La manière la plus simple (pas très utile): 'rdd.mapPartitions (_. ToVector.par.map (foo))'. Et pour répondre à votre deuxième question, nous ne le faisons tout simplement pas. Il dit seulement que si vous déclarez quatre coeurs d'exécuteur, et que 'spark.task.cpus' est égal à 2 alors il ne peut démarrer que 2 tâches. Mais il y a une allocation physique des cœurs ou des choses similaires. 'core' dans Spark est juste un fil. – zero323