J'ai lu Présentation du mode cluster et je ne comprends toujours pas les différents processus du cluster Spark Standalone et du parallélisme.
Le travailleur est-il un processus JVM ou non? J'ai exécuté le bin\start-slave.sh
et j'ai découvert qu'il engendrait le travailleur, qui est en fait une machine virtuelle.
Selon le lien ci-dessus, un exécuteur est un processus lancé pour une application sur un nœud de travail exécutant des tâches. Executor est également une JVM.
Ce sont mes questions:
Les exécuteurs sont par application. Alors quel est le rôle d'un travailleur? Est-ce que cela se coordonne avec l'exécuteur et communique le résultat au chauffeur? ou le conducteur parle-t-il directement à l'exécuteur? Si oui, quel est le but du travailleur alors?
Comment contrôler le nombre d'exécuteurs pour une application? 3.Peut-on exécuter les tâches en parallèle dans l'exécuteur? Si oui, comment configurer le nombre de threads pour un exécuteur?
Quelle est la relation entre les noyaux travailleur, exécuteurs et exécuteurs (--total-executor-cores)?
qu'est-ce que cela signifie d'avoir plus de travailleurs par nœud?
Mis à jour
Prenons des exemples pour mieux comprendre.
Exemple 1: Un cluster autonome avec 5 nœuds de travail (chaque nœud ayant 8 cœurs) Lorsque je lance une application avec des paramètres par défaut.
Exemple 2 Configuration de cluster identique à l'exemple 1, mais je lance une application avec les paramètres suivants --executor-cores 10 --total-executor-cores 10 .
Exemple 3 Même configuration de cluster que l'exemple 1, mais j'exécute une application avec les paramètres suivants --executor-cores 10 --total-executor-cores 50 .
Exemple 4 Même configuration de cluster que l'exemple 1, mais j'exécute une application avec les paramètres suivants --executor-cores 50 --total-executor-cores 50 .
Exemple 5 Même configuration de cluster que l'exemple 1, mais j'exécute une application avec les paramètres suivants --executor-cores 50 --total-executor-cores 10 .
Dans chacun de ces exemples, combien d'exécuteurs? Combien de threads par exécuteur? Combien de cœurs? Comment le nombre d'exécuteurs est-il déterminé par application? Est-ce toujours le même que le nombre de travailleurs?
Spark utilise une architecture maître/esclave. Comme vous pouvez le voir sur la figure, il dispose d'un coordinateur central (pilote) qui communique avec de nombreux travailleurs répartis (exécuteurs). Le pilote et chacun des exécuteurs s'exécutent dans leurs propres processus Java.
PILOTE
Le pilote est le processus d'exécution de la méthode principale. Tout d'abord, il convertit le programme utilisateur en tâches et ensuite, il planifie les tâches sur les exécuteurs.
EXÉCUTEURS
Les exécuteurs sont des processus de noeuds de travail chargés d'exécuter des tâches individuelles dans un travail donné Spark. Ils sont lancés au début d'une application Spark et s'exécutent généralement pendant toute la durée de vie d'une application. Une fois la tâche exécutée, ils envoient les résultats au pilote. Ils fournissent également un stockage en mémoire pour les RDD mis en cache par les programmes utilisateur via le gestionnaire de blocs.
FLUX D'EXÉCUTION D'APPLICATION
Dans cet esprit, lorsque vous soumettez une application au cluster avec spark-submit, c'est ce qui se passe en interne:
SparkContext
(et c'est seulement à ce moment-là que vous pouvez appeler l'application un pilote).Spark prend automatiquement en charge les machines défaillantes ou lentes en réexécutant les tâches défaillantes ou lentes. Par exemple, si le nœud exécutant une partition d'une opération map () se bloque, Spark l'exécutera à nouveau sur un autre nœud. et même si le nœud ne tombe pas en panne mais qu'il est simplement beaucoup plus lent que les autres nœuds, Spark peut lancer de manière préemptive une copie "spéculative" de la tâche sur un autre nœud et en obtenir le résultat s'il se termine.
VOS QUESTIONS
Lorsque les exécuteurs sont démarrés, ils s’enregistrent eux-mêmes auprès du chauffeur et communiquent directement entre eux. Les travailleurs sont chargés de communiquer au gestionnaire de grappes la disponibilité de leurs ressources.
Dans un cluster YARN, vous pouvez le faire avec --num-executors. Dans un cluster autonome, vous obtiendrez un exécuteur par travailleur sauf si vous jouez avec spark.executor.cores et qu'un ouvrier a suffisamment de cœurs pour contenir plus d'un exécuteur. (Comme @JacekLaskowski l'a souligné, --num-executors n'est plus utilisé dans YARN https://github.com/Apache/spark/commit/16b6d18613e150c7038c613992d80a7828413e66 )
Vous pouvez affecter le nombre de cœurs par exécuteur avec --executor-core.
--total-executor-cores est le nombre maximal de cœurs exécuteurs par application
Comme le disait Sean Owen dans ce thread : "il n’ya pas de bonne raison de faire fonctionner plus d’un ouvrier par machine". Vous auriez beaucoup de JVM assis dans une machine par exemple.
UPDATE
Je n'ai pas pu tester ce scénario, mais d'après la documentation:
EXEMPLE 1: Spark acquerra avidement autant de cœurs et d'exécuteurs que le planificateur lui propose. Donc, à la fin, vous aurez 5 exécuteurs avec 8 noyaux chacun.
EXEMPLES 2 à 5: Spark ne pourra pas allouer autant de cœurs que demandé par un seul ouvrier. Aucun exécuteur ne sera donc lancé.