Vous êtes sur la page 1sur 70

Base de Données NoSQL

Master BDA

Présenté par : Moustapha MBODJ


02 | 6
Let’s introduce 3

ourselves !
Let’s introduce
● Votre prénom
● Votre animal totem
● Adjectif qui définit votre animal totem
● Vos attentes par rapport au cours
Qui suis je?
Intro

● Qu'est-ce qu'une base de données NoSQL ?


● Différences entre les bases de données relationnelles et les bases de données
NoSQL
● Les motivations et les avantages des bases de données NoSQL
● Les inconvénients potentiels des bases de données NoSQL
Notre programme

● Choisir une solution NoSQL adaptée aux besoins



● Faire passer à l'échelle des bases de données NoSQL

● Déployer, administrer et utiliser un cluster MongoDB

● Rechercher et visualiser des documents avec ElasticSearch et Kibana
1. Choisir une solution NoSQL adaptée aux besoins

1. Choisissez votre famille NoSQL


2. Maitrisez le théorème de CAP
3. Passez à l'échelle
4. Choisissez votre base de données NoSQL
Préambule

Depuis les 70’s

➢ Stockage
➢ Interrogation
➢ Cohérence

Dédié au relationnel
Préambule
Depuis début millénaire

➢ Afflux massif de
données
➢ Diversité de la
données
➢ Débit élevé
Préambule

Langage SQL = relationnel mais présente un frein dans le cadre des 3V

Implique ⇒ Apparition du Not Only Sql pour contourner ce frein


NO SQL , KESAKO?

Changement de modèle de data = Distribution - Cohérence - Tolérance


NoSql Data Family

➢ Clé/Valeur
➢ Colonnes
➢ Documents
➢ Graphes.
1.1 Les clés-valeurs

Objectif de la famille clé-valeur :


Simplicité et Efficacité.
Un système clé-valeur qui agit comme 1 grande table de
hachage distribuée sur le réseau.

● La clé va identifier la donnée de manière unique puis permettre


de la gérer.

● La valeur contient n'importe quel type de données.


Seules opérations de type CRUD peuvent être utilisées :

Create (key,value)

Read (key)

Update (key,value)

Delete (key)
Exemple clés/Valeurs

Clés Amadou Fatima Alphonse Chérif

Valeurs Titre : Enseignant Lieu : UVS Thiès Titre : Resp Titre : Professeur
Lieu : Dakar Spécialité : Analytics, Formation Lieu : UVS Dakar
Spécialité : Nosql, Air, SEA Lieu : UVS St Louis Spécialité :
BDD Hobbies : Football, Spécialité : Datavisualisation
Hobbies : Football, Film Natation DevOps, Machine
Learning
1.2 Les lignes ⇒ les colonnes

Traditionnellement, les données sont représentées en ligne, représentant


l'ensemble des attributs.
Le stockage orienté colonne change ce paradigme en se focalisant sur
chaque attribut et en les distribuant.
Il est alors possible de focaliser les requêtes sur une ou plusieurs
colonnes, sans avoir à traiter les informations inutiles (les autres
colonnes).
Stockage orienté colonne

ID TITRE ID LIEU ID SPÉC ID HOBBIES

Amadou Enseignant Amadou Uvs Dakar Amadou Nosql Amadou Football


Fatima Fatima Uvs Thiès Amadou Air Amadou Film
Alphonse Resp Form Alphonse Uvs St Louis Amadou BDD Fatima Football
Chérif Professeur Chérif Uvs Dakar Fatima Analytics Fatima Natation
Fatima SEA
Alphonse DevOps
Alphonse Machine Learning
Chérif Datavisualisation
Type application stockage colonnes

● Reporting à large échelle


● Comptage (vote en ligne, compteur…)
● Journalisation
● Recherche de produits dans une catégorie
Pour qui ?

➢ BigTable (Google)

➢ HBase (Apache, Hadoop)

➢ Spark SQL (Apache)

➢ Elasticsearch (elastic) -> moteur de recherche


Gestion de documents

Les bases orientées documents ressemblent sans doute le plus à ce que l'on peut faire
dans une base de données classique pour des requêtes complexes. Le but de ce
stockage est de manipuler des documents contenant des informations avec une
structure complexe (types, listes, imbrications). Il repose sur le principe du clé/valeur,
mais avec une extension sur les champs qui composent ce document.
Clés Amadou Fatima Alphonse Chérif

{ { { {
"_id":"Amadou", "_id":"Fatima", "_id":"Alphonse", "_id":"Chérif",
"titre":"Enseigant", "lieu":{ "titre":"Resp Form", "titre":"Professeur",
"lieu":{ "nom":"Uvs Thiès", "lieu":{ "lieu":{
"nom":"Uvs Dakar", "adresse":"Fahu1", "nom":"Uvs St Louis", "nom":"Uvs Dakar",
"adresse":"Mermoz", "ville":"Thiès" "adresse":"Sor", "adresse":"Point E",
Documents "ville":"Dakar" }, "ville":"St Louis" "ville":"Dakar"
}, "spec":["Analytics"," }, },
"spec":["Nosql","Air"], SEA"], "spec":["DevOps","Machine "spec":["Datavisualisation"]
"hobbies":["Football", "Film"] "hobbies":["Football", Learning"] }
} "Natation"] }
}

L'avantage de cette solution est d'avoir une approche structurée de chaque valeur, formant ainsi un document.
De fait, ces solutions proposent des langages d'interrogation riches permettant de faire des manipulations
complexes sur chaque attribut du document (et sous-documents) comme dans une base de données
traditionnelles, tout en passant à l'échelle dans un contexte distribué.
Solutions existants pour gestion documents

● MongoDB (MongoDB) : ADP, Adobe, Bosch, Cisco, eBay, Electronic Arts,


Expedia, Foursquare

● CouchBase (Apache, Hadoop) : AOL, AT&T, Comcast, Disney, PayPal, Ryanair

● DynamoDB (Amazon) : BMW, Dropcam, Duolingo, Supercell, Zynga

● Cassandra (Facebook -> Apache) : NY Times, eBay, Sky, Pearson Education


Les Graphes en Nosql

Dans la base orientée graphe, les données stockées sont : les nœuds, les liens
et des propriétés sur ces nœuds et ces liens. Les requêtes que l'on peut
exprimer sont basées sur la gestion de chemins, de propagations, d'agrégations,
voire de recommandations.
Schéma Graphes
Quelles BDD pour la gestion des gros graphes?

● Neo4j : eBay, Cisco, UBS, HP, TomTom, The National Geographic Society

● OrientDB (Apache) : Comcast, Warner Music Group, Cisco, Sky, United


Nations, VErisign

● FlockDB (Twitter) : Twitter


2. Théorème de CAP
Propriétés BDD relationnelle
Atomicité : les transactions se font au complet ou pas du tout ; si une partie de la transaction échoue,
tout échoue.

Cohérence : la transaction transformera la base de données en un autre état valide, c'est-à-dire qu’une
opération, telle que l'écriture de données, n'entraînera pas la fin de la base de données dans un état
non autorisé (par paramètres de base de données).

Isolation : si une série de transactions se produit simultanément, l'état final de la base de données doit
être le même que celui qui serait obtenu si les transactions se produisaient une à la fois en série.

Durabilité : les transactions terminées ne sont jamais vénérées, même en cas de sinistre.
Que dit le théorème de CAP ?

Dans toute base de données, vous ne pouvez respecter au


plus que 2 propriétés parmi la cohérence, la disponibilité et
la distribution.
2. Théorème de CAP
Panorama et Identification de sa solution NoSQL

Une mutlitude de données en base mais comment en tirer profit ?


Oubliez les SGBD traditionnels, ils peinent à passer à l'échelle ! Vous devez être
capable de choisir la bonne solution parmi les dizaines qui s'offrent à vous.

Focus sur deux solutions NoSQL bien connues : MongoDb et ElasticSearch.


Mise en place MONGODB

Lien de telechargement : https://www.mongodb.com/try?jmp=nav#community

Sous Debian/Ubuntu, utilisez la commande “sudo apt install mongodb”.

Le serveur sera alors installé dans le répertoire que je nommerai : $MONGO.

Sous Windows : C:\Program Files\MongoDB\Server\3.4\


Sous Linux : /opt/local/bin/
Sous Mac : /Applications
Création d’un répertoire pour les données. : C:\data\db (par
défaut)

Sous Windows, il faut ouvrir l’explorateur de fichiers, aller à la racine “C:\”, puis créer le répertoire
“data”. Ensuite, aller dans ce répertoire et créer le répertoire “db”.

Sous Linux ou Mac, il faut créer le répertoire data à la racine avec “sudo mkdir /data”. Vous donnez
les droits (ex. utilisateur ‘toto’) : “sudo chown toto /data”. Et enfin, créer le répertoire db : “mkdir
/data/db”.

Sous Mac, décompressez l’archive et déplacez le répertoire dans vos applications “/Applications”

Il est possible de créer un autre répertoire dédié “$REP” pour les données de MongoDB. Dans ce
cas, le lancement du serveur (slide d’après ) devra utiliser le paramètre --dbpath $REP.
Lancement du serveur, avec l’exécutable mongod
(disponible sur $MONGO/bin)

ATTENTION ! ! !
Ne pas fermer la fenêtre sous peine d’éteindre la base de données.
Le serveur attend une connexion sur le port 27017.
Log de connexion du serveur mongod
Configurez les variables d'environnement nécessaires.

Ajoutez le chemin d'installation de MongoDB au PATH de votre système.

● Si vous utilisez Windows, ajoutez le chemin d'installation de MongoDB dans la variable


d'environnement "Path".
● Si vous utilisez macOS ou Linux, modifiez le fichier de configuration du shell (par exemple,
le fichier .bashrc ou .bash_profile) en ajoutant la ligne suivante :
PS : Remplacez <chemin_vers_mongodb_bin> par le chemin d'installation réel de MongoDB.
Vérification de l'installation en exécutant le serveur MongoDB et ligne de
commande

Ouvrez une nouvelle fenêtre de terminal ou de ligne de commande.


Démarrez le serveur MongoDB en exécutant la commande suivante :

Exécutez la commande suivante pour démarrer le shell MongoDB :


Interface utilisateur MongoDB

Nous utiliserons Robot3T qui se trouve dans le lien ci-dessous


https://robomongo.org/download
Sous Windows, l’application est installée par défaut dans le répertoire C:\Program
Files\3T\Robo3T

Sous Mac, il suffit de placer Robo3T dans le répertoire “Applications”

Sous Linux, le fichier d’installation doit être décompressé (tar xzvf


robo3t-1.1.1-linux-x86_64-c93c6b0.tar.gz). Puis, vous pouvez exécuter le binaire “bin/robo3t”
Si besoin

Il peut être demandé la plateforme “Qt” avec le plugin “xcb”. Dans ce cas,
suivez la procédure indiqué via ce lien:
https://stackoverflow.com/questions/45671105/robo3t-crashing-in-ubuntu-16
-04-and-above-version-this-application-failed-to-st
Création d’une collection MongoDB

Création d’ une base de données ‘ma_bd’ (bouton droit sur la connexion “Create
database”), puis sur les collections de cette base, créer une collection “test” (bouton
droit sur “Collections(0)”)
Modélisation documents JSON

Tout est clé/valeur : “clé” : “valeur”

Un document est encapsulé dans des accolades {...}, pouvant contenir des listes de
clés/valeurs

Une valeur peut être un type scalaire (entier, nombre, texte, booléen, null), des listes
de valeurs [...], ou des documents imbriqués

On peut donc insérer un document dans notre collection “test” (double click sur la
collection, champ de texte en noir pour exécuter une requête) :
Exemple

db.test.save (
{
"cours" : "NoSQL",
"chapitres" : ["familles", "CAP", "sharding", "choix"],
"auteur" : {
"nom" : "Ndiaye",
"prenom" : "Amadou"
}
})
Import de données

Décompresser l’archive envoyé par mail (j’appellerai le répertoire utilisé


$RESTAURANT)

Nous allons créer une base de données “new_york” (paramètre --db) et une collection
“restaurants” (paramètre --collection). Attention, il ne faut pas de majuscules !

Dans une console (Windows : invite de commande, Linux : Shell/Konsole), aller dans le
répertoire $MONGO/bin

Exécutez la commande suivante :

$MONGO/bin/mongoimport --db new_york --collection restaurants


$RESTAURANT/restaurants.json
Visualisation du résultat
Interrogation de données

db.restaurants.findOne()

{
"_id" : ObjectId("594b9172c96c61e672dcd689"),
"restaurant_id" : "30075445",
"name" : "Morris Park Bake Shop",
"borough" : "Bronx",
Pour visualiser un document "cuisine" : "Bakery",
"address" : {
de notre collection "building" : "1007",
"coord" :{"type":"Point","coordinates":[-73.856077,40.848447]},
restaurants. "street" : "Morris Park Ave",
"zipcode" : "10462"
},
"grades" : [
Utilisons la fonction {"date" : ISODate("2014-03-03T00:00:00.000Z"),"grade" : "A","score" : 2},
{"date" : ISODate("2013-09-11T00:00:00.000Z"),"grade" : "A","score" : 6},
"findOne()". {"date" : ISODate("2013-01-24T00:00:00.000Z"),"grade" : "A","score" : 10},
{"date" : ISODate("2011-11-23T00:00:00.000Z"),"grade" : "A","score" : 9},
{"date" : ISODate("2011-03-10T00:00:00.000Z"),"grade" : "B","score" : 14}
]
}
Filtrage des données

Nous utiliserons la fonction "find" que l’on va


appliquer directement à la collection.
Travaux Pratiques

Pour cet exercice, le cheminement des questions est successif avec la réponse
précédente!
1. Identifier l ‘ensemble des restaurants qui sont situés dans le quartier Brooklyn (
Borough pour les quartiers)
2. Déterminer leur nombre
3. A partir du résultat obtenu, identifer ceux qui font de la cuisine italienne
4. Ceux situés au niveau de la 5e Avenue
5. Ceux ayant dans leur nom le mot pizza
Réaliser des captures après chaque requête.
Filtrage avec des opérations

Pour plus d’informations sur les opérations, merci de consulter


https://docs.mongodb.com/v3.2/reference/operator/query/
Filtrage avec des opérations

$gt, >, ≥ Plus grand que (greater than) "a" : {"$gt" : 10}
$gte

$lt, $lte <, ≤ Plus petit que (less than) "a" : {"$lt" : 10}

$ne ≄ Différent de (not equal) "a" : {"$ne" : 10}

$in, $nin ∈, Fait parti de (ou ne doit pas) "a" : {"$in" : [10, 12, 15, 18] }

$or ៱ OU logique "a" : {“$or” : [{"$gt" : 10}, {“$lt” : 5} ] }

$and ៱ ET logique "a" : {“$and” : [{"$lt" : 10}, {“$gt” : 5} ] }

$not ¬ Négation “a" : {“$not” : {"$lt" : 10} }

$exists ∃ La clé existe dans le “a” : {“$exists” : 1}


document

$size test sur la taille d'une liste “a” : {“$size” : 5}


Partie 3: Introduction à ElasticSearch et Kibana
3.1 Qu'est-ce qu'ElasticSearch et Kibana?

Objectifs :

● Comprendre ce qu'est ElasticSearch et Kibana.


● Apprendre les bases de l'architecture et du fonctionnement
d'ElasticSearch et Kibana.
● Savoir comment installer et configurer ElasticSearch et Kibana.
Qu'est-ce qu'ElasticSearch et Kibana?
ElasticSearch est un moteur de recherche et
d'analyse distribué, basé sur Apache Lucene
Caractéristiques

● Indexation rapide
● Recherche en texte intégral
● Agrégations puissantes
● Distribution et haute disponibilité
Concrétement alors?

● Un site de E-commerce qui utilise ElasticSearch pour la gestion


catalogue produits. Chaque produit est un document indexé
dans ElasticSearch avec des attributs tels que le nom, la
description, la catégorie, le prix, etc. Lorsqu'un utilisateur
recherche un produit spécifique, ElasticSearch renvoie
rapidement les résultats les plus pertinents à partir de ce
catalogue volumineux.
Concrétement alors?
Kibana est une interface de visualisation de données qui
fonctionne en conjonction avec ElasticSearch.
Comment les 2 collaborent?
ElasticSearch stocke les données dans des index,
les indexe rapidement et les rend facilement
accessibles via des requêtes de recherche.

Kibana se connecte à ElasticSearch pour récupérer


les données et les présenter de manière visuelle
3.2 Architecture et fonctionnement de base
3.2.1 Architecture client-serveur
Requête clients CRUD Serveur retourne 1 réponse
3.2.2 Nœud maître
s
b ale
glo

CLUSTER
P
sO
de
on ex
sti nd
/r g
e e si r
d te
ste et as
l u
c ée u in ⇒ s d s g M
ion n oe rd in
i n at don s n Sha dm
rd ét a de n/ s a
oo M ting atio ête
:c l i s l c u
p i eq
le
Rô ● Ré es r
● *t t

Noeud 1
(Maître/Mast Noeud 3 Noeud 5
er)

Noeud 2 Noeud 4 Noeud 6


3.2.3 Rôle des autres nœuds de données
CLUSTER Rôle : Noeuds de données.
● Gestion index/ execution OP recherche &
indexation
● Reception requête “Master” ⇒ recherche
sur shards detenus
● Autonomie de chaque noeud et capacité
à traiter reqête de manière indépendante

Noeud 1
(Maïtre/Mast Noeud 3 Noeud 5
er)

Noeud 2 Noeud 4 Noeud 6


3.2.4 Répartition des index en shards et leur réplication
Cas pratique

Après avoir installé Elasticsearch & Kibana, nous allons


indexer un JDD factice et réaliser une serie de recherches
avec pour objectif de comprendre comment les résultats sont
renvoyés:

Vous allez créer des documents ( à minima 10 ) qui auront


des attributs tels que :
● le nom du produit
● la description
● la catégorie
● le prix

*On va repartir sur les mêmes types de produits vus dans les
parties précédentes ( Electromenager,
Electronique,Multimedia…)
Cas pratique

CONSIGNES :

● Indexation des données dans ElasticSearch

Utilisez l'API REST d'ElasticSearch pour indexer les documents dans un index appelé "produits". Vous pouvez
utiliser des outils comme cURL, Postman ou des bibliothèques de programmation pour effectuer les requêtes.

Utilisez la requête POST pour indexer chaque document

● Vérification de l'indexation

Pour vérifier que les documents ont été correctement indexés, effectuons une recherche pour
récupérer tous les documents dans l'index "produits".
Utilisez la requête GET pour effectuer une recherche

● Recherche de produits par catégorie

Supposons que nous voulons rechercher tous les produits de la catégorie "Electronique".
Utilisez une requête de recherche pour cela

Vous aimerez peut-être aussi