Le article de recherche Spark a préconisé un nouveau modèle de programmation distribuée par rapport à Hadoop MapReduce classique, revendiquant la simplification et l’amélioration considérable des performances, dans de nombreux cas, en particulier l’apprentissage automatique. Cependant, le matériel pour découvrir le internal mechanics
sur Resilient Distributed Datasets
avec Directed Acyclic Graph
semble manquer dans cet article.
Devrait-il être mieux appris en recherchant le code source?
Même j’ai cherché sur le Web pour savoir comment spark) calcule le DAG à partir du RDD et exécute ensuite la tâche.
Au niveau supérieur, lorsqu'une action est appelée sur le RDD, Spark crée le DAG et le soumet au planificateur de DAG.
Le planificateur de DAG divise les opérateurs en étapes de tâches. Une étape est composée de tâches basées sur des partitions des données d'entrée. Le planificateur DAG relie les opérateurs. Par exemple De nombreux opérateurs de carte peuvent être programmés en une seule étape. Le résultat final d'un planificateur de DAG est un ensemble d'étapes.
Les étapes sont transmises au planificateur de tâches. Le planificateur de tâches lance les tâches via le gestionnaire de cluster (Spark Standalone/Yarn/Mesos). Le planificateur de tâches ne connaît pas les dépendances des étapes.
Le travailleur exécute les tâches sur l'esclave.
Venons-en à comment Spark construit le DAG.
Au niveau supérieur, il existe deux transformations qui peuvent être appliquées aux RDD, à savoir transformation étroite et transformation étendue . Les grandes transformations entraînent essentiellement des limites de scène.
La transformation étroite - ne nécessite pas que les données soient brassées à travers les partitions. par exemple, carte, filtre, etc.
transformation étendue - nécessite de mélanger les données, par exemple, réduireByKey, etc.
Prenons un exemple de calcul du nombre de messages de journalisation apparaissant à chaque niveau de gravité,
Voici le fichier journal qui commence par le niveau de gravité,
INFO I'm Info message
WARN I'm a Warn message
INFO I'm another Info message
et créez le code scala) suivant pour extraire le même,
val input = sc.textFile("log.txt")
val splitedLines = input.map(line => line.split(" "))
.map(words => (words(0), 1))
.reduceByKey{(a,b) => a + b}
Cette séquence de commandes définit implicitement un DAG d’objets RDD (lignée RDD) qui sera utilisé ultérieurement lorsqu’une action est appelée. Chaque DDR conserve un pointeur sur un ou plusieurs parents avec les métadonnées sur le type de relation qu’il entretient avec le parent. Par exemple, lorsque nous appelons val b = a.map()
sur un RDD, le RDD b
conserve une référence à son parent a
, c'est une lignée.
Pour afficher le lignage d'un RDD, Spark fournit une méthode de débogage toDebugString()
. Par exemple, en exécutant toDebugString()
sur le splitedLines
RDD, affichera ce qui suit:
(2) ShuffledRDD[6] at reduceByKey at <console>:25 []
+-(2) MapPartitionsRDD[5] at map at <console>:24 []
| MapPartitionsRDD[4] at map at <console>:23 []
| log.txt MapPartitionsRDD[1] at textFile at <console>:21 []
| log.txt HadoopRDD[0] at textFile at <console>:21 []
La première ligne (à partir du bas) montre le RDD en entrée. Nous avons créé ce RDD en appelant sc.textFile()
. Vous trouverez ci-dessous la vue plus schématique du graphe DAG créé à partir du RDD donné.
Une fois le DAG créé, le planificateur Spark crée un plan d'exécution physique. Comme indiqué ci-dessus, le planificateur DAG divise le graphique en plusieurs étapes. Les étapes sont créées en fonction des transformations. Les transformations étroites seront regroupés (alignés) en une seule étape. Ainsi, pour notre exemple, Spark créera une exécution en deux étapes comme suit:
Le planificateur de DAG soumettra ensuite les étapes dans le planificateur de tâches. Le nombre de tâches soumises dépend du nombre de partitions présentes dans le fichier texte. Dans l'exemple Fox, nous considérons que nous avons 4 partitions dans cet exemple, puis 4 ensembles de tâches seront créés et soumis en parallèle, à condition qu'il y ait suffisamment d'esclaves/cœurs. Le diagramme ci-dessous illustre ceci plus en détail:
Pour des informations plus détaillées, je vous suggère de visionner les vidéos sur youtube suivantes où les créateurs Spark donnent des détails détaillés sur le DAG, le plan d’exécution et la durée de vie.
Début Spark 1.4
_ la visualisation des données a été ajoutée à travers les trois composants suivants, où elle fournit également une représentation graphique claire de DAG
.
Vue chronologique des événements Spark
DAG d'exécution
Visualisation de Spark Statistiques en streaming
Reportez-vous à lien pour plus d'informations.