Apache Spark possède une architecture primaire/secondaire hiérarchique. Le Spark Driver est le nœud principal qui contrôle le gestionnaire de cluster, qui gère les nœuds secondaires et fournit les résultats des données au client de l’application.
En fonction du code d’application, Spark Driver génère le SparkContext, qui fonctionne avec le gestionnaire de cluster (Standalone Cluster Manager de Spark ou d’autres gestionnaires de cluster tels que Hadoop YARN, Kubernetes ou Mesos) pour distribuer et surveiller l’exécution dans l’ensemble des nœuds. Il crée également des jeux de données distribués résilients (RDD), qui sont la clé de la vitesse de traitement remarquable de Spark.
Jeu de données distribué résilient (RDD)
Les jeux de données distribués résilients (« Resilient Distributed Datasets » ou RDD) sont des collections d’éléments tolérants aux pannes qui peuvent être distribués entre plusieurs nœuds d’un cluster et traités en parallèle. Les RDD sont une structure fondamentale dans Apache Spark.
Spark charge les données en référençant une source de données ou en parallélisant une collection existante avec la méthode de parallélisation SparkContext de mise en cache des données dans un RDD pour traitement. Une fois les données chargées dans un RDD, Spark effectue des transformations et des actions sur les RDD en mémoire, la clé de la vitesse de Spark. Spark stocke également les données en mémoire, sauf si le système manque de mémoire ou si l’utilisateur décide d’écrire les données sur le disque pour les conserver.
Chaque jeu de données dans un RDD est divisé en partitions logiques, qui peuvent être calculées sur différents nœuds du cluster. Et les utilisateurs peuvent effectuer deux types d’opérations RDD: les transformations et les actions. Les transformations sont des opérations appliquées pour créer un nouveau RDD. Les actions sont utilisées pour indiquer à Apache Spark d’appliquer le calcul et de transmettre le résultat au pilote.
Spark prend en charge diverses actions et transformations sur les RDD. Cette distribution est effectuée par Spark, de sorte que les utilisateurs n’ont pas à se soucier de calculer la bonne distribution.
Graphe acyclique dirigé (DAG)
Contrairement au processus d’exécution en deux étapes de MapReduce, Spark crée un graphique acyclique dirigé (« Directed Acyclic Graph » ou DAG) pour planifier les tâches et l’orchestration des nœuds dans le cluster. Au fur et à mesure que Spark agit et transforme les données dans les processus d’exécution des tâches, le planificateur DAG facilite l’efficacité en orchestrant les nœuds dans le cluster. Ce suivi des tâches rend la tolérance aux pannes possible, car il réapplique les opérations enregistrées aux données d’un état précédent.
DataFrames et jeux de données
Outre les RDD, Spark gère deux autres types de données : les DataFrames et les jeux de données.
Les DataFrames sont les interfaces de programmation des applications (API) structurées les plus courantes et représentent une table de données avec des lignes et des colonnes. Bien que les RDD aient été une fonctionnalité essentielle de Spark, elle est désormais en mode maintenance. En raison de la popularité de la bibliothèque de machine learning (MLlib) de Spark, les DataFrames ont joué le rôle principal en tant qu’API principale pour MLlib (un ensemble d’algorithmes de machine learning pour l’évolutivité assortis d’outils pour la sélection des fonctionnalités et la création de pipelines de ML). Il est important de garder cela à l’esprit lors de l’utilisation de l’API MLlib, car les DataFrames assurent l’uniformité dans les différents langages, comme Scala, Java, Python et R.
Les jeux de données sont une extension des DataFrames, qui fournissent une interface de programmation orientée objet et sécurisée. Les jeux de données sont, par défaut, une collection d’objets JVM fortement typés, contrairement aux DataFrames.
Spark SQL permet d’interroger des données à partir de DataFrames et d’entrepôts de données SQL, tels qu’Apache Hive. Les requêtes Spark SQL renvoient un DataFrame ou un jeu de données lorsqu’elles sont exécutées dans une autre langue.
Spark Core
Spark Core constitue la base de tout le traitement parallèle des données et gère la planification, l’optimisation, les RDD et l’abstraction des données. Spark Core fournit la base fonctionnelle des bibliothèques Spark, de Spark SQL, de Spark Streaming, de la bibliothèque de machine learning MLlib et du traitement des données graphiques GraphX. Le Spark Core et le gestionnaire de cluster distribuent les données dans le cluster Spark et en font des abstractions. Cette distribution et cette abstraction rendent le traitement du big data très rapide et intuitif.
API Spark
Spark comprend une variété d’ interfaces de programmation des applications (API) pour apporter la puissance de Spark au plus large public. Spark SQL permet d’interagir avec les données des RDD de manière relationnelle. Spark dispose également d’une API bien documentée pour Scala, Java, Python et R. Chaque API de langage dans Spark a ses propres nuances dans la façon dont elle traite les données. Les RDD, les DataFrames et les jeux de données sont disponibles dans chaque API de langage. Avec des API pour une telle variété de langages, Spark rend le traitement du big data accessible à des groupes plus diversifiés de personnes ayant une expérience en développement, en science des données, en ingénierie des données et en statistiques.