Spark comme hub d’échange de données

Introduction à Spark

Spark est un framework de calcul distribué très en vogue actuellement. Il dispose de nombreux avantages parmi lesquels:

  • La simplicité de ses structures de données (RDD, DataFrame, DataSets)
  • Sa puissance du fait que ces structures de données soient chargées, distribuées et sécurisées en mémoire.
  • Sa facilité d’intégration aux plateformes de cluster tels qu’Hadoop (et YARN), Mesos mais également sur les plateformes Kubernetes lui permettant ainsi de mettre le pied dans des environnements conteneurisés. Il existe également la possibilité de l’installer sur un environnement simple (standalone) sans cluster.
  • Sa richesse d’API. Ainsi Spark est accessible à partir de nombreux langages tels que Java, Python, Scala, et le langage de traitements statistiques R.
  • Ses modules et librairies notamment :
    • la couche d’abstraction Spark SQL
    • la librairie de Machine Learning (Spark MLLib) permettant d’entrainer un modèle d’apprentissage en quelques lignes de code tout en bénéficiant de la puissance de calcul du cluster utilisé.
    • la librarie de Streaming (Spark Streaming) permettant de s’interfacer très simplement avec les systèmes de flux en temps réels tels que Kafka notamment.
  • Sa simplicité d’écriture. Il est en effet très simple d’écrire un programme tout en limitant le nombre de lignes de code produit (Cela est encore plus vérifiable pour Scala et Python).

Un de ses nombreux avantage réside également dans le fait qu’il peut s’interfacer, en entrée, comme en sortie, avec de nombreux formats et sources de données (Fichiers CSV, JSON, Parquet, ORC, source de données JDBC).

Nous vous proposons de parcourir rapidement l’ensemble de ces possibilités.

Création d’une dataframe à partir de sources de données

Lecture à partir d’une source de données relationnelle

Dans cette partie, nous allons voir comment il est très simple de charger une structure de type dataframe à partir d’une source de données JDBC (Oracle). On pourra alors travailler ce dataframe pour filtrer des données, créer un nouveau dataframe pour en extraire de l’information et le transformer.

Ci-dessous un exemple en écrit en scala permettant de réaliser une telle opération.

Une fois la dataframe créée, il devient très simple d’exécuter une requête SQL sur celle-ci afin d’en sortir les informations d’intérêt. (Dans l’exemple ci-dessous, on créé une nouvelle dataframe à partir de la session spark).

Lecture à partir d’une source de données de type CSV.

La lecture d’un fichier CSV est également relativement simple et aisée. Il suffit encore d’utiliser la fonction read à partir de la session spark.

Dans l’exemple ci-dessous. Nous allons réaliser la jointure entre deux dataframes. La première est issue d’une source de données, relationnelle et la seconde de la lecture d’un fichier CSV:

Persistance des données en Base de données relationnelle

La persistance d’une dataFrame dans une base de données relationnelle se fait grâce à la fonction write de la session Spark (Object SparkSession).

La encore, nous utilisons SCALA qui est d’une simplificité déconcertante pour faire persister une dataFrame en base relationnelle. (A noter que dans le cas présent, il est recommandé de positionner le niveau d’isolation utilisé par votre SGBDr de destination (ici READ_COMMITTED pour Oracle).

Ensuite, deux cas se présentent, votre table de destination existe ou pas. Par défaut, spark créé la table de destination (et génère une ORA-00942 si la table existe). Pour éviter cela, il faut utiliser le mode APPEND.

Persistance par défaut

Il ne reste ensuite qu’à faire persister la dataframe

Une fois la dataframe créé en base (sous forme de table), il ne reste plus qu’à contrôler la structure de table et les données :

Persistance en mode APPEND.

La méthode est identique aux code snippetx précédents. La différence réside dans l’ajout du mode “APPEND” dans  la commande de persistance.

Persistance dans un fichier

La persistance peut également être réalisée au sein d’un fichier. Ce fichier peut être dans un format supporté par spark 2.0 et supérieurs : CSV, Parquet, ORC, JSON, ou texte.

Si on reprend un des exemples précédent dans lequel on réalise une jointure entre deux sources de données. La première provenant d’une base relationnelle, et l’autre d’un fichier texte.

On peut alors faire persister le résultat dans le fichier souhaité, par exemple:

  • CSV

  • JSON

  • PARQUET

Bien évidemment, toutes ces méthodes sont transposables aux langages Java, ou encore Python.


Vous avez des projets sous Spark, n’hésitez pas à nous contacter à l’adresse contact@premiseo.com ou aux numéros suivants: 06.60.99.70.46 / 06.76.87.02.82