🎃🧙‍♂️👻 La déco d'Halloween est en place ! Pis je pense pas l'enlever pour Noël, Grinch veut pas. 🎃🧙‍♂️👻

Potion Bottle Icon Manuel d'alchimie du code Potion Bottle Icon

NoSQL et Apache Cassandra — comprendre le modèle distribué et son utilisation avec Spark

- 1,382 mots - Temps de lecture estimé: 8 minutes

🌘 TLDR

Cassandra est une base NoSQL distribuée conçue pour supporter des volumes massifs de données avec haute disponibilité et scalabilité horizontale. Cet article présente les avantages et limites du NoSQL, les bases du modèle de colonnes, le théorème CAP et le fonctionnement de Cassandra : keyspaces, tables, partitions. J’explique également comment utiliser le langage CQL, comment connecter Spark pour exécuter des analyses avancées et je fournis un exemple complet avec les données ouvertes des taxis de New-York. Ce guide vise à offrir un aperçu pédagogique du NoSQL moderne, sans promouvoir une solution particulière.

🌘 Introduction

Le NoSQL représente une approche alternative de la modélisation des bases de données. Ce n’est pas nécessairement mieux que les bases de données relationnelles, mais il répond à des besoins différents, entre autres pour les volumes de données importants qui ne peuvent pas être stockés sur un seul serveur.

SQL vs. NoSQL


Sun Face IconQu’est-ce que Cassandra ?Sun Face Icon


Cassandra est une base de données NoSQL distribuée conçue pour gérer des volumes massifs de données avec haute disponibilité et scalabilité horizontale. Elle s’appuie sur un modèle de colonnes, une réplication automatique et une architecture sans point unique de défaillance.

Note importante: Cet article a été rédigé en 2018. Les concepts présentés restent valides, mais l’écosystème NoSQL a évolué. Cet article garde un objectif éducatif pour comprendre les fondations.

🌘 Pourquoi choisir un NoSQL comme Cassandra plutôt qu’un SGBD relationnel ?

🌘 Inconvénients

🌘 Différence fondamentale

🌘 Théorème CAP

Le théorème CAP établit qu’il est impossible d’avoir simultanément ces trois propriétés dans un système distribué :

Les bases de données NoSQL font généralement un compromis entre ces propriétés selon leur cas d’usage.

Théorème CAP

🌘 Apache Cassandra

Logo de Cassandra

Cassandra est une base de données de type “familles de colonnes” distribuée et hautement disponible :

🌘 Architecture distribuée : comment Cassandra gère la scalabilité

Les données sont stockées sous forme de paires clés-valeurs dans des fichiers partitionnés selon la famille de colonnes et une règle de partitionnement des clés.

Enregistrement dans Cassandra

Cette architecture distribuée permet d’avoir des données avec le même schéma distribuées sur différents noeuds d’entrée. Ça offre une capacité en écriture très élevée qui est pratique pour :

🌘 Le langage CQL

Le langage CQL (Cassandra Query Language) est similaire au SQL mais adapté au modèle de Cassandra :

Le langage CQL

🌘 Apache Spark

Fonctionnement d'Apache Spark

Moteur analytique distribué qui complète bien Cassandra et d’autres bases de données pour les données massives :

Certaines bases NoSQL comme Cassandra ne supportent pas les jointures serveur, mais celles-ci peuvent être simulées via Spark. Ça en fait un complément quasi indispensable.

Tutoriel en français : Bases de données documentaires et distribuées

🌘 Cassandra dans un pipeline analytique moderne (Spark)

Voici une démonstration avec les données ouvertes des taxis de New-York.

🌘 Création du schéma dans Cassandra

Nous allons d’abord créer le schéma dans la base de données Cassandra à l’aide du langage CQL.

CREATE KEYSPACE DEMOTAXI WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}  AND durable_writes = true;
USE DEMOTAXI;

CREATE TABLE demotaxi.trip_fare
(
medallion TEXT,
hack_license TEXT,
vendor_id TEXT,
pickup_datetime TIMESTAMP,
payment_type TEXT,
fare_amount DOUBLE,
surcharge DOUBLE,
mta_tax DOUBLE,
tip_amount DOUBLE,
tolls_amount DOUBLE,
total_amount DOUBLE,
PRIMARY KEY (medallion,pickup_datetime)
);

CREATE TABLE demotaxi.avg_fare_per_medallion
(
medallion TEXT PRIMARY KEY,
avg_fare_amount DOUBLE
);

🌘 Chargement des modules requis

Cette première section est le préambule du code, où on charge les modules requis.

import com.datastax.spark.connector.cql.CassandraConnectorConf
import org.apache.spark.sql.cassandra._
import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession}
import org.apache.spark.sql.types._
import org.apache.spark.sql.functions._
import spark.implicits._

🌘 Initialisation de la connexion à Cassandra

On initialise maintenant la connexion à la base de données Cassandra dans une session Spark. Toute la session va utiliser la source de données spécifiée ici, à moins qu’on en ajoute d’autres en cours de route.

val spark: SparkSession = {
  SparkSession
  .builder()
  .master("local")
  .appName("Load Fare Data")
  .config("spark.cassandra.auth.username","cassandra")
  .config("spark.cassandra.auth.password","motdepasse")
  .getOrCreate()
}

// Configurer la connexion à Cassandra
spark.setCassandraConf("Cluster1",
  CassandraConnectorConf.ConnectionHostParam.option("adresse_ip") ++
    CassandraConnectorConf.ConnectionPortParam.option(9042)
)

🌘 Chargement des données CSV

On va maintenant charger les données au format CSV dans une structure de données qui va définir la table que l’on va ensuite écrire dans Cassandra.

Définition du schéma de la structure Row utilisée pour lire les données du fichier CSV :

val trip_fare_schema: StructType = StructType(Array(
    StructField("medallion",StringType,true),
    StructField("hack_license",StringType,true),
    StructField("vendor_id",StringType,true),
    StructField("pickup_datetime",TimestampType,true),
    StructField("payment_type",StringType,true),
    StructField("fare_amount",DoubleType,true),
    StructField("surcharge",DoubleType,true),
    StructField("mta_tax",DoubleType,true),
    StructField("tip_amount",DoubleType,true),
    StructField("tolls_amount",DoubleType,true),
    StructField("total_amount",DoubleType,true)
  )
)

Lecture des données :

val trip_fare: DataFrame = {
  spark
    .read
    .option("header","true")
    .schema(trip_fare_schema)
    .csv("F:\\faredata2013\\trip_fare_1.csv")
}

🌘 Écriture dans Cassandra

On va maintenant écrire dans Cassandra.

Écriture dans Cassandra :

{
  trip_fare
    .write
    .mode(SaveMode.Overwrite)
    .cassandraFormat(table="trip_fare",
                    keyspace = "demotaxi",
                    cluster="Cluster1")
    .save()
}

Écriture dans Cassandra

🌘 Lecture depuis Cassandra

On va lire les données que l’on a écrite dans la base de données à l’étape précédente. On va utiliser ici le DataFrame, qui est une structure dite “paresseuse” qui ne va lire les données qu’au besoin.

Lecture depuis Cassandra :

val cass_indexed_trip_fare: DataFrame = {
  spark
  .read
  .cassandraFormat(table="trip_fare",
                   keyspace = "demotaxi",
                   cluster="Cluster1")
  .load()
}

Lecture dans Cassandra

🌘 Calculs et sauvegarde

On va maintenant effectuer différents calculs et les sauvegarder dans la base de données et sur un fichier.

Imprimer le schéma des données lues dans Cassandra :

cass_indexed_trip_fare.printSchema()

Compter le nombre de rangées du DataFrame :

cass_indexed_trip_fare.count()

Calculer la moyenne par médaillon :

val avg_fare_per_medallion: DataFrame = cass_indexed_trip_fare.groupBy("medallion").avg("fare_amount").toDF("medallion","avg_fare_amount")

Imprimer le schéma du DataFrame calculé précédemment :

avg_fare_per_medallion.printSchema()

Enregistrer ces données dans une table Cassandra :

{
  avg_fare_per_medallion.
    write.
    cassandraFormat(table="avg_fare_per_medallion",keyspace = "demotaxi",cluster="Cluster1").
    save()
}

Sauvegarder sur le disque local :

{
  avg_fare_per_medallion.
    write.
    mode(SaveMode.Overwrite).
    option("header","true").
    csv("avg_fare_per_medallion.csv")
}

🌘 Discussion

Points à considérer pour l’adoption du NoSQL :

🌘 Références

The World’s Next Top Data Model by Patrick McFadin

Shooting Stars IconConsultation ExpressShooting Stars Icon

Bénéficie d'une heure de consultation dédiée avec François pour résoudre tes défis informatiques et stratégiques. Que ce soit pour la migration vers des technologies libres, la sécurisation de tes systèmes, la documentation de tes procédures, la conception de petits systèmes ou l'automatisation de tâches, cette session intensive t'offre des solutions concrètes et un plan d'action clair.

Tu seras libre ensuite de poursuivre avec un forfait de consultation sur mesure ou les programmes DéconstruIT ou Pleine Confiance

Découvre la Consultation Express.
Abonne-toi au fil RSS pour ne rien manquer.

Étiquettes