Utiliser Spark avec Cassandra

Le but est de faire une étude de données rapide en utilisant Spark et Cassandra. Cassandra est une base de donnée NoSQL orientée colonne reconnue pour ses très bonnes performances en lecture/écriture. Pour fournir cela, Cassandra s'appuie sur cluster de noeud en anneau où il n'y a ni maitre ni esclave. Spark est un framework de traitement distribués utilisant la mémoire. Datastax, l'entreprise fournissant Cassandra, a créé un connecteur permettant de connecter Spark sur un cluster Cassandra. Cela permet de faire des traitements distribués très rapidement, Spark fournissant des facilités de calcul distribué que ne possède pas Cassandra. On utilise un jeu de données relativement consistant, de 1,2 million de lignes, qui est le fichier de la collections des bibliothèques et fonds spécialisés et patrimoniaux, fourni par la ville de Paris ici.

On dispose d'un cluster de trois machines. Spark est installé sur les trois machine, et Cassandra sur les deux noeuds esclaves de Spark.

Création des tables dans Cassandra

On commence par créer le keyspace et les tables dans Cassandra. On créé aussi la table lang dans laquelle seront enregistrés les résultats du décompte de documents par langue. Il est possible d'utiliser driectement dans Spark une fonction pour faire ceci, mais ce n'est pas disponible dans la version de notre connecteur.

Import des données

Normalement, il est possible d'utiliser une commande spéciale de cqlsh, COPY, qui permet d'importer directement un jeu de données. Celui-ci possède cependant des erreurs, et il n'est pas possible de les ignorer avec cette commande. On va donc passer par Python pour importer ces données.

Exécution des requêtes dans Spark

On peut désormais accéder aux données depuis Spark.

Ce type de requête est un anti-pattern de Cassandra, car il abouti à faire un full table scan. Le fait de passer par Spark est très efficace car on utilise le traitement distribué. On obtient un résultat de 1190754 en 35s ce qui est proche du nombre de ligne initiale (1191307). Par comparaison, la même requête, Cassandra mets 1m42s à s'exécuter, et cet écart ne demande qu'à augmenter avec le volume.

Pour calculer le nombre de documents par langue :

Ce qui correspond aux chiffres donnés sur la page fournissant les données. On en profite pour enregistrer les résultats dans la table lang de Cassandra, définie précédemment.

On souhaite maintenant calculer le nombre de pages moyen par document écrit. Pour cela, on extrait le nombre de page avec une regexp à partir de l'attribut document (souvent de la forme 1 vol. (145 p.) ;). On commence par filtrer les documents qui sont des textes imprimés, et qui suivent ce format.

On se retrouve du coup avec un bon échantillon de document. On peut maintenant effectuer un mapreduce, où on extrait le nombre de page dans la map, et où l'on compte dans le reduce.

Soit une moyenne de 261 pages par document.