Qu'est-ce qu'Apache Spark? La plateforme Big Data qui a écrasé Hadoop

Apache Spark défini

Apache Spark est une infrastructure de traitement de données qui peut effectuer rapidement des tâches de traitement sur de très grands ensembles de données, et peut également distribuer des tâches de traitement de données sur plusieurs ordinateurs, seul ou en tandem avec d'autres outils informatiques distribués. Ces deux qualités sont essentielles dans les mondes du big data et de l'apprentissage automatique, qui nécessitent la mobilisation d'une puissance de calcul massive pour traverser de grands magasins de données. Spark supprime également une partie du fardeau de programmation de ces tâches des épaules des développeurs avec une API facile à utiliser qui fait abstraction d'une grande partie du travail acharné de l'informatique distribuée et du traitement des mégadonnées.

Depuis ses modestes débuts dans l'AMPLab de l'UC Berkeley en 2009, Apache Spark est devenu l'un des principaux frameworks de traitement distribué Big Data dans le monde. Spark peut être déployé de différentes manières, fournit des liaisons natives pour les langages de programmation Java, Scala, Python et R, et prend en charge SQL, le streaming de données, l'apprentissage automatique et le traitement de graphiques. Vous le trouverez utilisé par les banques, les entreprises de télécommunications, les sociétés de jeux, les gouvernements et tous les grands géants de la technologie tels qu'Apple, Facebook, IBM et Microsoft.

Architecture Apache Spark

À un niveau fondamental, une application Apache Spark se compose de deux composants principaux: un pilote, qui convertit le code de l'utilisateur en plusieurs tâches pouvant être réparties sur les nœuds de travail, et des exécuteurs, qui s'exécutent sur ces nœuds et exécutent les tâches qui leur sont assignées. Une forme de gestionnaire de cluster est nécessaire pour assurer la médiation entre les deux.

Prêt à l'emploi, Spark peut s'exécuter dans un mode de cluster autonome qui nécessite simplement le framework Apache Spark et une JVM sur chaque machine de votre cluster. Cependant, il est plus probable que vous souhaitiez profiter d'un système de gestion de ressources ou de cluster plus robuste pour vous occuper de l'allocation des travailleurs à la demande. Dans l'entreprise, cela signifie normalement s'exécuter sur Hadoop YARN (c'est ainsi que les distributions Cloudera et Hortonworks exécutent les travaux Spark), mais Apache Spark peut également s'exécuter sur Apache Mesos, Kubernetes et Docker Swarm.

Si vous recherchez une solution gérée, Apache Spark peut être trouvé dans le cadre d'Amazon EMR, Google Cloud Dataproc et Microsoft Azure HDInsight. Databricks, la société qui emploie les fondateurs d'Apache Spark, propose également la Databricks Unified Analytics Platform, un service géré complet qui offre des clusters Apache Spark, une prise en charge de la diffusion en continu, un développement de notebook intégré basé sur le Web et des performances d'E / S cloud optimisées sur une distribution standard d'Apache Spark.

Apache Spark construit les commandes de traitement des données de l'utilisateur dans un graphique acyclique dirigé , ou DAG. Le DAG est la couche de planification d'Apache Spark; il détermine quelles tâches sont exécutées sur quels nœuds et dans quel ordre.  

Spark vs Hadoop: pourquoi utiliser Apache Spark?

Il convient de noter qu'Apache Spark vs Apache Hadoop est un peu un abus de langage. Vous trouverez Spark inclus dans la plupart des distributions Hadoop de nos jours. Mais en raison de deux grands avantages, Spark est devenu le cadre de choix lors du traitement du Big Data, dépassant l'ancien paradigme MapReduce qui a fait de Hadoop une place de choix.

Le premier avantage est la rapidité. Le moteur de données en mémoire de Spark signifie qu'il peut effectuer des tâches jusqu'à cent fois plus rapidement que MapReduce dans certaines situations, en particulier par rapport aux travaux à plusieurs étapes qui nécessitent l'écriture de l'état sur le disque entre les étapes. En substance, MapReduce crée un graphique d'exécution en deux étapes consistant en un mappage et une réduction des données, tandis que le DAG d'Apache Spark comporte plusieurs étapes qui peuvent être distribuées plus efficacement. Même les tâches Apache Spark où les données ne peuvent pas être complètement contenues dans la mémoire ont tendance à être environ 10 fois plus rapides que leur homologue MapReduce.

Le deuxième avantage est l'API Spark conviviale pour les développeurs. Aussi important que soit l'accélération de Spark, on pourrait dire que la convivialité de l'API Spark est encore plus importante.

Spark Core

Par rapport à MapReduce et à d'autres composants Apache Hadoop, l'API Apache Spark est très conviviale pour les développeurs, cachant une grande partie de la complexité d'un moteur de traitement distribué derrière des appels de méthode simples. L'exemple canonique de ceci est la façon dont près de 50 lignes de code MapReduce pour compter les mots dans un document peuvent être réduites à seulement quelques lignes d'Apache Spark (ici montré dans Scala):

val textFile = sparkSession.sparkContext.textFile ("hdfs: /// tmp / words")

val count = textFile.flatMap (line => line.split (““))

                      .map (mot => (mot, 1))

                      .reduceByKey (_ + _)

count.saveAsTextFile ("hdfs: /// tmp / words_agg")

En fournissant des liaisons à des langages populaires pour l'analyse de données tels que Python et R, ainsi qu'à Java et Scala, plus conviviaux pour les entreprises, Apache Spark permet à tout le monde, des développeurs d'applications aux scientifiques de données, d'exploiter son évolutivité et sa vitesse de manière accessible.

Spark RDD

Au cœur d'Apache Spark se trouve le concept du Resilient Distributed Dataset (RDD), une abstraction de programmation qui représente une collection immuable d'objets pouvant être divisés sur un cluster informatique. Les opérations sur les RDD peuvent également être réparties sur le cluster et exécutées dans un processus par lots parallèle, conduisant à un traitement parallèle rapide et évolutif.

Les RDD peuvent être créés à partir de simples fichiers texte, de bases de données SQL, de magasins NoSQL (tels que Cassandra et MongoDB), de compartiments Amazon S3 et bien plus encore. Une grande partie de l'API Spark Core repose sur ce concept RDD, permettant une cartographie traditionnelle et réduisant les fonctionnalités, mais fournissant également une prise en charge intégrée pour la jonction d'ensembles de données, le filtrage, l'échantillonnage et l'agrégation.

Spark s'exécute de manière distribuée en combinant un processus principal de pilote qui divise une application Spark en tâches et les répartit entre de nombreux processus exécuteurs qui effectuent le travail. Ces exécuteurs peuvent être augmentés et réduits selon les besoins de l'application.

Spark SQL

Initialement connu sous le nom de Shark, Spark SQL est devenu de plus en plus important pour le projet Apache Spark. C'est probablement l'interface la plus couramment utilisée par les développeurs d'aujourd'hui lors de la création d'applications. Spark SQL se concentre sur le traitement des données structurées, en utilisant une approche dataframe empruntée à R et Python (en Pandas). Mais comme son nom l'indique, Spark SQL fournit également une interface compatible SQL2003 pour l'interrogation des données, apportant la puissance d'Apache Spark aux analystes ainsi qu'aux développeurs.

Parallèlement à la prise en charge SQL standard, Spark SQL fournit une interface standard pour la lecture et l'écriture vers d'autres banques de données, notamment JSON, HDFS, Apache Hive, JDBC, Apache ORC et Apache Parquet, qui sont tous pris en charge par défaut. D'autres magasins populaires (Apache Cassandra, MongoDB, Apache HBase et bien d'autres) peuvent être utilisés en tirant des connecteurs séparés de l'écosystème Spark Packages.

La sélection de certaines colonnes à partir d'un dataframe est aussi simple que cette ligne:

citiesDF.select ("nom", "pop")

En utilisant l'interface SQL, nous enregistrons le dataframe en tant que table temporaire, après quoi nous pouvons émettre des requêtes SQL contre lui:

citiesDF.createOrReplaceTempView («villes»)

spark.sql ("SELECT nom, pop FROM villes")

Dans les coulisses, Apache Spark utilise un optimiseur de requête appelé Catalyst qui examine les données et les requêtes afin de produire un plan de requête efficace pour la localisation des données et le calcul qui effectuera les calculs requis dans le cluster. À l'ère d'Apache Spark 2.x, l'interface Spark SQL des dataframes et des ensembles de données (essentiellement une dataframe typée dont l'exactitude peut être vérifiée au moment de la compilation et tirer parti de la mémoire supplémentaire et des optimisations de calcul au moment de l'exécution) est l'approche recommandée pour le développement . L'interface RDD est toujours disponible, mais recommandée uniquement si vos besoins ne peuvent pas être satisfaits dans le paradigme Spark SQL.

Spark 2.4 a introduit un ensemble de fonctions intégrées d'ordre supérieur pour manipuler directement des tableaux et d'autres types de données d'ordre supérieur.

Spark MLlib

Apache Spark regroupe également des bibliothèques pour appliquer des techniques d'apprentissage automatique et d'analyse de graphes aux données à grande échelle. Spark MLlib comprend un cadre pour la création de pipelines d'apprentissage automatique, permettant une implémentation facile de l'extraction, des sélections et des transformations d'entités sur n'importe quel jeu de données structuré. MLlib est livré avec des implémentations distribuées d'algorithmes de clustering et de classification tels que le clustering k-means et les forêts aléatoires qui peuvent être échangées facilement dans et hors de pipelines personnalisés. Les modèles peuvent être formés par des data scientists dans Apache Spark à l'aide de R ou Python, enregistrés à l'aide de MLlib, puis importés dans un pipeline basé sur Java ou Scala pour une utilisation en production.

Notez que si Spark MLlib couvre l'apprentissage automatique de base, y compris la classification, la régression, le clustering et le filtrage, il n'inclut pas les fonctionnalités de modélisation et d'entraînement des réseaux de neurones profonds (pour plus de détails, consultez la revue Spark MLlib de). Cependant, les pipelines de Deep Learning sont en préparation.

Spark GraphX

Spark GraphX ​​est livré avec une sélection d'algorithmes distribués pour le traitement des structures graphiques, y compris une implémentation du PageRank de Google. Ces algorithmes utilisent l'approche RDD de Spark Core pour modéliser les données; le package GraphFrames vous permet d'effectuer des opérations graphiques sur des dataframes, notamment en tirant parti de l'optimiseur Catalyst pour les requêtes graphiques.

Spark Streaming

Spark Streaming était un ajout précoce à Apache Spark qui l'a aidé à gagner du terrain dans les environnements nécessitant un traitement en temps réel ou presque. Auparavant, le traitement par lots et par flux dans le monde d'Apache Hadoop était des choses distinctes. Vous écririez du code MapReduce pour vos besoins de traitement par lots et utiliseriez quelque chose comme Apache Storm pour vos besoins de streaming en temps réel. Cela conduit évidemment à des bases de code disparates qui doivent être synchronisées pour le domaine d'application bien qu'elles soient basées sur des frameworks complètement différents, nécessitant des ressources différentes et impliquant différentes préoccupations opérationnelles pour les exécuter.

Spark Streaming a étendu le concept Apache Spark de traitement par lots en streaming en décomposant le flux en une série continue de microbatchs, qui pourraient ensuite être manipulés à l'aide de l'API Apache Spark. De cette manière, le code dans les opérations de traitement par lots et de streaming peut partager (principalement) le même code, s'exécutant sur le même framework, réduisant ainsi à la fois la charge de travail du développeur et de l'opérateur. Tout le monde y gagne.

Une critique de l'approche Spark Streaming est que le microbatching, dans les scénarios où une réponse à faible latence aux données entrantes est requise, peut ne pas être en mesure d'égaler les performances d'autres frameworks compatibles avec la diffusion en continu comme Apache Storm, Apache Flink et Apache Apex, qui utilisent tous une méthode de diffusion pure plutôt que des microbatchs.

Streaming structuré

Le streaming structuré (ajouté dans Spark 2.x) est à Spark Streaming ce que Spark SQL était aux API Spark Core: une API de niveau supérieur et une abstraction plus simple pour l'écriture d'applications. Dans le cas de Structure Streaming, l'API de niveau supérieur permet essentiellement aux développeurs de créer des cadres de données et des ensembles de données en streaming infini. Cela résout également certains problèmes très réels avec lesquels les utilisateurs ont eu du mal dans le cadre précédent, en particulier en ce qui concerne le traitement des agrégations au moment des événements et la livraison tardive des messages. Toutes les requêtes sur les flux structurés passent par l'optimiseur de requêtes Catalyst et peuvent même être exécutées de manière interactive, permettant aux utilisateurs d'effectuer des requêtes SQL sur des données de diffusion en direct.

Le streaming structuré reposait à l'origine sur le schéma de microbatching de Spark Streaming pour gérer les données de streaming. Mais dans Spark 2.3, l'équipe Apache Spark a ajouté un mode de traitement continu à faible latence au streaming structuré, lui permettant de gérer des réponses avec des latences aussi faibles que 1 ms, ce qui est très impressionnant. Depuis Spark 2.4, le traitement continu est toujours considéré comme expérimental. Alors que le streaming structuré repose sur le moteur Spark SQL, le streaming continu ne prend en charge qu'un ensemble restreint de requêtes.

Le streaming structuré est l'avenir des applications de streaming avec la plate-forme, donc si vous créez une nouvelle application de streaming, vous devriez utiliser le streaming structuré. Les anciennes API Spark Streaming continueront d'être prises en charge, mais le projet recommande le portage vers Structured Streaming, car la nouvelle méthode rend l'écriture et la maintenance du code de streaming beaucoup plus supportables.

Pipelines d'apprentissage profond

Apache Spark prend en charge l'apprentissage en profondeur via des pipelines d'apprentissage profond. À l'aide de la structure de pipeline existante de MLlib, vous pouvez appeler des bibliothèques d'apprentissage en profondeur de niveau inférieur et créer des classificateurs en quelques lignes de code, ainsi qu'appliquer des graphiques TensorFlow ou des modèles Keras personnalisés aux données entrantes. Ces graphiques et modèles peuvent même être enregistrés en tant que UDF Spark SQL personnalisées (fonctions définies par l'utilisateur) afin que les modèles d'apprentissage en profondeur puissent être appliqués aux données dans le cadre d'instructions SQL.

Tutoriels Apache Spark

Prêt à plonger et à apprendre Apache Spark? Nous recommandons vivement A Neanderthal's Guide to Apache Spark in Python d'Evan Heitman, qui non seulement décrit les bases du fonctionnement d'Apache Spark en termes relativement simples, mais vous guide également à travers le processus d'écriture d'une application Python simple qui utilise le framework. . L'article est écrit du point de vue d'un scientifique des données, ce qui est logique car la science des données est un monde dans lequel le big data et l'apprentissage automatique sont de plus en plus critiques.

Si vous recherchez des exemples Apache Spark pour vous donner une idée de ce que la plate-forme peut faire et comment elle le fait, consultez Spark By {Exemples}. Il existe de nombreux exemples de code ici pour un certain nombre de tâches de base qui constituent les blocs de construction de la programmation Spark, afin que vous puissiez voir les composants qui composent les tâches plus importantes pour lesquelles Apache Spark est conçu.

Besoin d'aller plus loin? DZone a ce qu'il appelle modestement The Complete Apache Spark Collection, qui consiste en une multitude de didacticiels utiles sur de nombreux sujets Apache Spark. Bon apprentissage!