Comment DAG travaille sous les couvertures de RDD?

Le document de recherche Spark a prescrit un nouveau modèle de programmation dissortingbué par rapport à Hadoop MapReduce classique, revendiquant la simplification et l’amélioration considérable des performances dans de nombreux cas, spécialement sur Machine Learning. Cependant, le matériel pour découvrir les internal mechanics Resilient Dissortingbuted Datasets de Resilient Dissortingbuted Datasets avec des Directed Acyclic Graph semble manquer dans cet article.

Devrait-on mieux apprendre en étudiant le code source?

J’ai même cherché sur le Web comment l’étincelle 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 DAG.

  • Le planificateur 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 associe 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 DAG est un ensemble d’étapes.

  • Les étapes sont transmises au planificateur de tâches. Le planificateur de tâches lance des 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.

Voyons comment Spark construit le DAG.

À un niveau élevé, deux transformations peuvent être appliquées aux DDR, à savoir la transformation étroite et la transformation étendue . Les transformations larges aboutissent essentiellement à des limites de scène.

Transformation étroite : les données ne doivent pas être mélangées sur les partitions. par exemple, carte, filtre etc.

transformation large – nécessite que les données soient mélangées, par exemple, réduireByKey, etc.

Prenons un exemple de comptage du nombre de messages de journal qui apparaissent à 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éer 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’objects RDD (lignage RDD) qui sera utilisé ultérieurement lorsqu’une action est appelée. Chaque RDD maintient un pointeur vers 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 garde une référence à son parent a , qui est une lignée.

Pour afficher la lignée d’un RDD, Spark fournit une méthode de débogage toDebugSsortingng() . Par exemple, si vous exécutez toDebugSsortingng() sur le RDD splitedLines , le résultat sera le suivant:

 (2) ShuffledRDD[6] at reduceByKey at :25 [] +-(2) MapPartitionsRDD[5] at map at :24 [] | MapPartitionsRDD[4] at map at :23 [] | log.txt MapPartitionsRDD[1] at textFile at :21 [] | log.txt HadoopRDD[0] at textFile at :21 [] 

La première ligne (depuis le bas) montre l’entrée RDD. Nous avons créé ce RDD en appelant sc.textFile() . Vous trouverez ci-dessous une vue plus schématique du graphique DAG créé à partir du RDD donné.

Graphique DAG RDD

Une fois le DAG créé, le planificateur Spark crée un plan d’exécution physique. Comme mentionné 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ées en une seule étape. Donc, pour notre exemple, Spark créera une exécution en deux étapes comme suit:

Étapes

Le planificateur DAG soumettra ensuite les étapes au planificateur de tâches. Le nombre de tâches soumises dépend du nombre de partitions présentes dans le textFile. Fox exemple considérons que nous avons 4 partitions dans cet exemple, alors il y aura 4 ensemble de tâches créées et soumises en parallèle, à condition qu’il y ait suffisamment d’esclaves / cores. Le diagramme ci-dessous illustre ceci plus en détail:

Exécution de tâches

Pour des informations plus détaillées, je vous suggère de parcourir les vidéos youtube suivantes, où les créateurs Spark donnent des détails détaillés sur le DAG et le plan d’exécution et la durée de vie.

  1. Advanced Apache Spark – Sameer Farooqui (Databricks)
  2. Une compréhension approfondie des composants internes Spark – Aaron Davidson (Databricks)
  3. Introduction aux composants internes d’AmpLab Spark

La visualisation des données à partir de Spark 1.4 a été ajoutée à travers les trois composants suivants, où elle fournit également une représentation graphique claire du DAG .

  • Vue chronologique des événements Spark

  • DAG d’exécution

  • Visualisation des statistiques Spark Streaming

Reportez-vous au lien pour plus d’informations.