Spark pour les débutants : Introduction

English English

Qu’est-ce que Spark ?

Apache Spark est un framework de traitements Big Data open source construit pour effectuer des analyses sophistiquées et conçu pour la rapidité et la facilité d’utilisation. Celui-ci a originellement été développé par AMPLab, de l’Université UC Berkeley, en 2009 et passé open source sous forme de projet Apache en 2010.

Spark présente plusieurs avantages par rapport aux autres technologies big data et MapReduce comme Hadoop et Storm. D’abord, Spark propose un framework complet et unifié pour répondre aux besoins de traitements Big Data pour divers jeux de données, divers par leur nature (texte, graphe, etc.) aussi bien que par le type de source (batch ou flux temps-réel). Ensuite, Spark permet à des applications sur clusters Hadoop d’être exécutées jusqu’à 100 fois plus vite en mémoire, 10 fois plus vite sur disque. Il vous permet d’écrire rapidement des applications en Java, Scala ou Python et inclut un jeu de plus de 80 opérateurs haut-niveau. De plus, il est possible de l’utiliser de façon interactive pour requêter les données depuis un shell.

Enfin, en plus des opérations de Map et Reduce, Spark supporte les requêtes SQL et le streaming de données et propose des fonctionnalités de machine learning et de traitements orientés graphe. Les développeurs peuvent utiliser ces possibilités en stand-alone ou en les combinant en une chaîne de traitement complexe.

Ce premier article de la série propose un aperçu de ce qu’est Spark, de la suite d’outils mis à disposition pour les traitements Big Data et explique comment Spark se positionne par rapport aux solutions classiques de MapReduce.

Hadoop et Spark

Hadoop est positionné en tant que technologie de traitement de données depuis 10 ans et a prouvé être la solution de choix pour le traitement de gros volumes de données. MapReduce est une très bonne solution pour les traitements à passe unique mais n’est pas la plus efficace pour les cas d’utilisation nécessitant des traitements et algorithmes à plusieurs passes. Chaque étape d’un workflow de traitement étant constituée d’une phase de Map et d’une phase de Reduce, il est nécessaire d’exprimer tous les cas d’utilisation sous forme de patterns MapReduce pour tirer profit de cette solution. Les données en sortie de l’exécution de chaque étape doivent être stockées sur système de fichier distribué avant que l’étape suivante commence. Cette approche a tendance à être peu rapide à cause de la réplication et du stockage sur disque.

De plus, les solutions Hadoop s’appuient généralement sur des clusters, qui sont difficiles à mettre en place et à administrer. Elles nécessitent aussi l’intégration de plusieurs outils pour les différents cas d’utilisation big data (comme Mahout pour le Machine Learning et Storm pour le traitement par flux).

Si vous souhaitez mettre en place quelque chose de plus complexe, vous devrez enchaîner une série de jobs MapReduce et les exécuter séquentiellement, chacun de ces jobs présentant une latence élevée et aucun ne pouvant commencer avant que le précédent n’ait tout-à-fait terminé.

Spark permet de développer des pipelines de traitement de données complexes, à plusieurs étapes, en s’appuyant sur des graphes orientés acycliques (DAG). Spark permet de partager les données en mémoire entre les graphes, de façon à ce que plusieurs jobs puissent travailler sur le même jeu de données. Spark s’exécute sur des infrastructures Hadoop Distributed File System (HDFS) et propose des fonctionnalités supplémentaires. Il est possible de déployer des applications Spark sur un cluster Hadoop v1 existant (avec SIMR – Spark-Inside-MapReduce), sur un cluster Hadoop v2 YARN ou même sur Apache Mesos. Plutôt que de voir en Spark un remplaçant d’Hadoop, il est plus correct de le voir comme une alternative au MapReduce d’Hadoop. Spark n’a pas été prévu pour remplacer Hadoop mais pour mettre à disposition une solution complète et unifiée permettant de prendre en charge différents cas d’utilisation et besoins dans le cadre des traitements big data.

Les fonctionnalités de Spark

Spark apporte des améliorations à MapReduce grâce à des étapes de shuffle moins coûteuses. Avec le stockage en mémoire et un traitement proche du temps-réel, la performance peut être plusieurs fois plus rapide que d’autres technologies big data. Spark supporte également les évaluations paresseuses (« lazy evaluation ») des requêtes, ce qui aide à l’optimisation des étapes de traitement. Il propose une API de haut-niveau pour une meilleure productivité et un modèle d’architecture cohérent pour les solutions big data.

Spark maintient les résultats intermédiaires en mémoire plutôt que sur disque, ce qui est très utile en particulier lorsqu’il est nécessaire de travailler à plusieurs reprises sur le même jeu de données. Le moteur d’exécution est conçu pour travailler aussi bien en mémoire que sur disque. Les opérateurs réalisent des opérations externes lorsque la donnée ne tient pas en mémoire, ce qui permet de traiter des jeux de données plus volumineux que la mémoire agrégée d’un cluster. Spark essaye de stocker le plus possible en mémoire avant de basculer sur disque. Il est capable de travailler avec une partie des données en mémoire, une autre sur disque.

Il est nécessaire d’examiner ses données et ses cas d’utilisation pour évaluer ses besoins en mémoire car, en fonction du travail fait en mémoire, Spark peut présenter d’importants avantages de performance. Les autres fonctionnalités proposées par Spark comprennent :

  • Des fonctions autres que Map et Reduce
  • L’optimisation de graphes d’opérateurs arbitraires
  • L’évaluation paresseuse des requêtes, ce qui aide à optimiser le workflow global de traitement
  • Des APIs concises et cohérentes en Scala, Java et Python
  • Un shell interactif pour Scala et Python (non disponible encore en Java)

Spark est écrit en Scala et s’exécute sur la machine virtuelle Java (JVM). Les langages supportés actuellement pour le développement d’applications sont :

  • Scala
  • Java
  • Python
  • Clojure
  • R

L’écosystème de Spark

À côté des API principales de Spark, l’écosystème contient des librairies additionnelles qui permettent de travailler dans le domaine des analyses big data et du machine learning. Parmi ces librairies, on trouve :

  • Spark Streaming : Spark Streaming peut être utilisé pour traitement temps-réel des données en flux. Il s’appuie sur un mode de traitement en « micro batch » et utilise pour les données temps-réel DStream, c’est-à-dire une série de RDD (Resilient Distributed Dataset).
  • Spark SQL : Spark SQL permet d’exposer les jeux de données Spark via API JDBC et d’exécuter des requêtes de type SQL en utilisant les outils BI et de visualisation traditionnels. Spark SQL permet d’extraire, transformer et charger des données sous différents formats (JSON, Parquet, base de données) et les exposer pour des requêtes ad-hoc.
  • Spark MLlib : MLlib est une librarie de machine learning qui contient tous les algorithmes et utilitaires d’apprentissage classiques, comme la classification, la régression, le clustering, le filtrage collaboratif, la réduction de dimensions, en plus des primitives d’optimisation sous-jacentes.
  • Spark GraphX : GraphX est la nouvelle API (en version alpha) pour les traitements de graphes et de parallélisation de graphes. GraphX étend les RDD de Spark en introduisant le Resilient Distributed Dataset Graph, un multi-graphe orienté avec des propriétés attachées aux nœuds et aux arrêtes. Pour le support de ces traitements, GraphX expose un jeu d’opérateurs de base (par exemple subgraph, joinVertices, aggregateMessages), ainsi qu’une variante optimisée de l’API Pregel. De plus, GraphX inclut une collection toujours plus importante d’algorithmes et de builders pour simplifier les tâches d’analyse de graphes.

En plus de ces librairies, on peut citer BlinkDB et Tachyon : BlinkDB est un moteur de requêtes approximatif qui peut être utilisé pour exécuter des requêtes SQL interactives sur des volumes de données importants. Il permet à l’utilisateur de troquer la précision contre le temps de réponse. Il fonctionne en exécutant les requêtes sur des extraits des données et présente ses résultats accompagnés d’annotations avec les indicateurs d’erreurs significatifs. Tachyon est un système de fichiers distribué qui permet de partager des fichiers de façon fiable à la vitesse des accès en mémoire à travers des frameworks de clusters comme Spark et MapReduce. Il évite les accès disques et le chargement des fichiers fréquemment utilisés en les cachant en mémoire. Ceci permet aux divers frameworks, tâches et requêtes d’accéder aux fichiers en cache rapidement.

Il existe aussi des adaptateurs pour intégration à d’autres produits comme Cassandra (Spark Cassandra Connector) et R (SparkR). Avec le connecteur Cassandra, vous pouvez utiliser Spark pour accéder à des données stockées dans Cassandra et réaliser des analyses sur ces données.

Le diagramme suivant (Figure 1) montre les relations entre ces différentes librairies de l’écosystème.

Nous explorerons ces librairies dans les futurs articles de cette série.

L’architecture de Spark

L’architecture de Spark comprend les trois composants principaux suivants :

  • Le stockage des données
  • L’API
  • Le Framework de gestion des ressources

Regardons chacun de ces composants plus en détails.

Le stockage des données :

Spark utilise le système de fichiers HDFS pour le stockage des données. Il peut fonctionner avec n’importe quelle source de données compatible avec Hadoop, dont HDFS, HBase, Cassandra, etc.

L’API :

L’API permet aux développeurs de créer des applications Spark en utilisant une API standard. L’API existe en Scala, Java et Python. Les liens ci-dessous pointent vers les sites présentant les API Spark pour chacun de ces langages :

Gestion des ressources

Spark peut être déployé comme un serveur autonome ou sur un framework de traitements distribués comme Mesos ou YARN. La figure 2 illustre les composants du modèle d’architecture de Spark.

Comment installer Spark

Il y a plusieurs façons d’installer et d’utiliser Spark. Vous pouvez l’installer sur votre machine, comme framework autonome ou utiliser une des images de machine virtuelle (Spark Virtual Machine) disponibles chez des éditeurs comme Cloudera, HortonWorks ou MapR. Vous pouvez aussi utiliser Spark déjà installé et configuré, sur le Cloud (comme Databricks Cloud).

Comment exécuter Spark ?

Lorsque Spark est installé sur une machine locale ou sur le Cloud, différents modes de connexion au moteur Spark sont possibles. La table ci-dessous présente le paramètre Master URL utilisable pour les différents modes d’exécution.

 

Comment interagir avec Spark ?

Une fois que Spark est installé et est en cours d’exécution, vous pouvez vous y connecter en utilisant le Shell Spark pour effectuer des analyses de données interactives. Le Shell Spark est disponible pour les langages Scala et Python. Java ne supporte pas encore de Shell interactif, donc cette fonctionnalité n’est pas encore disponible pour Java. Vous pouvez utiliser les commandes spark-shell.cmd et pyspark.cmd pour lancer respectivement le Shell avec Scala et Python.

La console Web

Quand Spark est en cours d’exécution, quel que soit le mode d’exécution, vous pouvez consulter les résultats des jobs et d’autres statistiques en accédant à la console Web, via l’URL suivante : http://localhost:4040 La figure 3 montre la console Spark, avec ses onglets pour les étapes, le stockage, l’environnement et les exécuteurs.