SlideShare une entreprise Scribd logo
1  sur  86
Télécharger pour lire hors ligne
#DevoxxFR
Algorithmes distribués
pour le Big Data
saison 2
1
#DevoxxFR
Un peu de moi
Duy Hai DOAN
Evangéliste technique & consultant Apache Cassandra
•  talks, meetups, confs
•  projet open-source (Achilles, Apache Zeppelin)
•  Des questions sur Apache Cassandra/Apache Zeppelin ?
☞ duy_hai.doan@datastax.com
☞ @doanduyhai
2
#DevoxxFR
Datastax
•  Fondé en Avril 2010
•  Plus gros pourvoyeur de contributeur à Apache Cassandra™
•  Bureaux européens à Londres, Paris et Berlin
•  Datastax Enterprise = OSS Cassandra + fonctionnalités+++
3
#DevoxxFR
CRDT
Marc Shapiro – 2011
#DevoxxFR
Le défi
5
Dans un système distribué,
définir les conditions suffisantes à respecter
pour garantir la convergence des données
potentiellement désynchronisées
#DevoxxFR
Le défi
6
Dans un système distribué,
définir les conditions suffisantes à respecter
pour garantir la convergence des données
potentiellement désynchronisées
#DevoxxFR
Le défi
7
Dans un système distribué,
définir les conditions suffisantes à respecter
pour garantir la convergence des données
potentiellement désynchronisées
#DevoxxFR
Le défi
8
Dans un système distribué,
définir les conditions suffisantes à respecter
pour garantir la convergence des données
potentiellement désynchronisées
#DevoxxFR
CRDT
9
Conflict-free Replicated Data Types
Définit les conditions suffisantes pour un système
"strong eventually consistent"
Autorise une disponibilité extrême, N-1 nœuds en panne
sur N nœuds au total
#DevoxxFR 10
Types de CRDT
À état: Convergent Replicated Data Types (CvRDT)
Par fonction: Commutative Replicated Data Types (CmRDT)
#DevoxxFR
CvRDT: conditions d’application
11
Tous les réplicas sont connectés (en général)
Échange d’état au moins 1 fois, sur un médium ponctuellement
fiable
L’ensemble des états forme un demi-treillis borné
Tous les changements d’état transitionnent vers un nouvel état en
suivant l’ordre partiel
#DevoxxFR
CvRDT: conditions d’application
12
Tous les réplicas sont connectés (en général)
Échange d’état au moins 1 fois, sur un médium ponctuellement
fiable
L’ensemble des états forme un demi-treillis borné
Tous les changements d’état transitionnent vers un nouvel état en
suivant l’ordre partiel
#DevoxxFR
CvRDT: conditions d’application
13
Tous les réplicas sont connectés (en général)
Échange d’état au moins 1 fois, sur un médium ponctuellement
fiable
L’ensemble des états forme un demi-treillis borné
Tous les changements d’état transitionnent vers un nouvel état en
suivant l’ordre partiel
Ensemble d’éléments partiellement ordonnés
ayant un borne supérieure (merci Wikipedia)
#DevoxxFR
CvRDT: conditions d’application
14
Tous les réplicas sont connectés (en général)
Échange d’état au moins 1 fois, sur un médium ponctuellement
fiable
L’ensemble des états forme un demi-treillis borné
Tous les changements d’état transitionnent vers un nouvel état en
suivant l’ordre partiel
#DevoxxFR
Définition formelle
#DevoxxFR
CvRDT: définition
16
A join semilattice (or just semilattice hereafter) is a partial order ≤v
equipped with a least upper bound (LUB) ⊔v, defined as follows:
Definition 2.4 m = x ⊔v y is a least upper bound of {x, y} under ≤v iff
x ≤v m and
y ≤v m and
there is no m′ ≤v m such that x ≤v m′ and y ≤v m′
It follows from the definition that ⊔v is: commutative: x ⊔v y =v y ⊔v x;
idempotent: x ⊔v x =v x; and associative: (x⊔v y)⊔v z =v x⊔v (y⊔v z).
#DevoxxFR
CvRDT: spécification
17
#DevoxxFR
CvRDT: exemple G-Set
18
Payload
Set S, initial value S := { }
Query(e)
e ∈ S ?
Update
add(e): S := S ∪ {e}
Merge(S’)
S := S ∪ S’
relation d’ordre ≤v = ∈
opérateur ⊔v = ∪
l’union ensembliste ∪ est
commutative, associative et
idempotente
#DevoxxFR
relation d’ordre ≤v = ∈
opérateur ⊔v = ∪
l’union ensembliste ∪ est
commutative, associative et
idempotente
CvRDT: exemple G-Set
19
Payload
Set S, valeur initiale S := { }
Query(e)
e ∈ S ?
Update
add(e): S := S ∪ {e}
Merge(S’)
S := S ∪ S’
Problème: comment
gérer les suppressions
d’éléments dans
le Set ?
#DevoxxFR
CvRDT: 2P-Set
20
Payload
Set A, R initial value A := { } , R := { }
Query(e)
(e ∈ A) ∧ (e ∉ R) ?
Update
add(e): A := A ∪ {e}, remove(e): R := R ∪ {e}
Merge(A’, R’)
A := A ∪ A’, R := R ∪ R’
#DevoxxFR
CvRDT: LWW-Register
21
Payload
(X, timestamp t), (∅, 0)
Query(e)
e = X ?
Update
assign(e): X := e, t := now()
Merge((X’, t’))
If t’ < t then (X, t) else (X’, t’) à take value of max(timestamp)
#DevoxxFR
Quelles applications ?
22
Systèmes "eventually consistent"
Compteurs distribués
Graphes orientés a-cycliques
Shopping Cart
#DevoxxFR
Quelques implémentations
23
Cassandra Last Write Win
Riak
GearPump RealTime Streaming Engine (LightBend)
SoundCloud Roshi
#DevoxxFR
Cassandra LWW
H
A
E
D
B C
G F
coordinateur
INSERT/UPDATE
1
2 3
(X, t1)
(X, t1)
(X, t1)
X
#DevoxxFR
Cassandra LWW
H
A
E
D
B C
G F
1
2 3 (X, t1)(X, t1)
(X, t1)
coordinateur
INSERT/UPDATE
Y
(Y, t2)
#DevoxxFR
Cassandra LWW
H
A
E
D
B C
G F
coordinateur
SELECT
1
2 3
(X, t1)(Y, t2)
(X, t1)
Y
#DevoxxFR
Cassandra LWW
Et si t1 == t2 ? (précision timestamp à la ms) 
Les DELETE sont prioritaires sur les INSERT/UPDATE
Comparer les valeurs par l’ordre de leur type (String, Date …) et
prendre la valeur la plus élevée
#DevoxxFR
Et si t1 == t2 ? (précision timestamp à la ms) 
Les DELETE sont prioritaires sur les INSERT/UPDATE
Comparer les valeurs par l’ordre de leur type (String, Date …) et
prendre la valeur la plus élevée
Cette règle est-elle ?
- commutative
- associative
- idempotente
Cassandra LWW
#DevoxxFR
Cassandra LWW
Associativité
[("toto", t1), ("titi", t1)], ("tata",t1) à [("toto", t1), ("tata",t1)] à ("toto", t1) 
("toto", t1), [("titi", t1), ("tata",t1)] à [("toto", t1), ("titi",t1)] à ("toto", t1)
Commutativité
("toto", t1), ("tata",t1) à ("toto", t1)
("tata", t1), ("toto",t1) à ("toto", t1)
Idempotence
("toto", t1), ("toto",t1) à ("toto", t1)
#DevoxxFR
Q & R
! "
#DevoxxFR
RAMP Transactions
Peter Bailis – 2014
#DevoxxFR
Le défi
32
Dans un système distribué,
définir un algorithme
garantissant des lectures atomiques
sur des opérations multi-partitions
#DevoxxFR
Le défi
33
Dans un système distribué,
définir un algorithme
garantissant des lectures atomiques
sur des opérations multi-partitions
#DevoxxFR
Le défi
34
Dans un système distribué,
définir un algorithme
garantissant des lectures atomiques
sur des opérations multi-partitions
Pas de garantie d’isolation ou
d’écriture atomique
#DevoxxFR
Le défi
35
Dans un système distribué,
définir un algorithme
garantissant des lectures atomiques
sur des opérations multi-partitions
#DevoxxFR
Solutions existantes
36
Lock global
Multi-version concurrency control
Optimistic concurrency control
(Google F1)
#DevoxxFR
Un peu de théorie
37
Serializability
Repeatable Read
Cursor Stability
Read Commited
Read Uncommited
Snapshot Isolation Linearizability
Causal
PRAM (Pipelined RAM)
RYW (Read Your Write)
Eventual Consistency
#DevoxxFR
Un peu de théorie
38
Serializability
Repeatable Read
Cursor Stability
Read Commited
Read Uncommited
Snapshot Isolation Linearizability
Causal
PRAM (Pipelined RAM)
RYW (Read Your Write)
Eventual Consistency
Coordination
synchrone
Sans
Coordination
#DevoxxFR
Un peu de théorie
39
Serializability
Repeatable Read
Cursor Stability
Read Commited
Read Uncommited
Snapshot Isolation Linearizability
Causal
PRAM (Pipelined RAM)
RYW (Read Your Write)
Eventual Consistency
Coordination
synchrone
Sans
Coordination
RAMP Transactions
#DevoxxFR
Read Atomic Multi-Partitions Transaction
Fournit une "visibilité atomique"
☞ Soit toutes les mises à jour d’une transaction sont
visibles, soit aucune ne l’est
RAMP Transaction
40
#DevoxxFR
Visibilité atomique par l’exemple
41
P1 P2
WRITE X = 1
WRITE Y = 1
READ X = 1
READ Y = 1
READ X = ∅
READ Y = ∅
Ou
#DevoxxFR
Visibilité atomique par l’exemple
42
P1 P2
WRITE X = 1
WRITE Y = 1
READ X = 1
READ Y = 1
READ X = ∅
READ Y = ∅
Ou
✘
✘
#DevoxxFR
Idépendance de Partition
☞ les clients n’ont besoin de contacter que les partitions
impliquées dans la transaction
Idépendance de Synchronisation
☞ la transaction d’un client ne peut bloquer les autres
clients.
☞ si le client peut accéder aux partitions de la
transaction, la transaction sera réussie à terme.
Garanties RAMP Transaction
43
#DevoxxFR
2PC avec méta-données + multi-versioning limité
Implémentation
44
#DevoxxFR
RAMP – Fast (Prepare)
45
Writer P1 P2
WRITE <X = 1,t1, {Y}>
Data=[ ], lastcommit=[ ]Data=[ ], lastcommit=[ ]WRITE X = 1
WRITE Y = 1
Prepare
Data=[<X = 1,t1, {Y}>]
WRITE <Y = 1,t1, {X}>
Prepare
Data=[<Y = 1,t1, {X}>]
#DevoxxFR
RAMP – Fast (Prepare)
46
Writer P1 P2
Data=[<Y = 1,t1, {X}>],
lastcommit=[ ]
Data=[<X = 1,t1, {Y}>],
lastcommit=[ ]
Prepared
Prepared
#DevoxxFR
RAMP – Fast (Commit)
47
Writer P1 P2
t1
Commit
lastcommit=[<X,t1>]
Commit
Data=[<Y = 1,t1, {X}>]Data=[<X = 1,t1, {Y}>]
t1 lastcommit=[<Y,t1>]
#DevoxxFR
RAMP – Fast (Commit)
48
Writer P1 P2
Data=[<Y = 1,t1, {X}>],
lastcommit=[<Y,t1>]
Data=[<X = 1,t1, {Y}>],
lastcommit=[<X,t1>]
Committed
Committed
#DevoxxFR
RAMP – Fast (Get)
49
Reader P1 P2
(X, ∅)
Get
lastcommit=[ <X,t1>]
Get
Data=[<Y = 1,t1, {X}>]Data=[<X = 1,t1, {Y}>]
(Y, ∅)
lastcommit=[ <Y,t1>]
#DevoxxFR
RAMP – Fast (Get)
50
Reader P1 P2
<X = 1,t1, {Y}>
lastcommit=[ <X,t1>]
Data=[<Y = 1,t1, {X}>]Data=[<X = 1,t1, {Y}>]
<Y = 1,t1, {X}>
lastcommit=[ <Y,t1>]
Max(t1, t1) = t1
Xt1 = 1
Yt1 = 1 ✔︎
#DevoxxFR
RAMP – Fast (Read & Write)
51
Writer1 P1 P2
WRITE <X = 1,t1, {Y}>
Data=[ ], lastcommit=[ ]Data=[ ], lastcommit=[ ]WRITE X = 1
WRITE Y = 1
Prepare
Data=[<X = 1,t1, {Y}>]
WRITE <Y = 1,t1, {X}>
Prepare
Data=[<Y = 1,t1, {X}>]
#DevoxxFR
RAMP – Fast (Read & Write)
52
Writer1 P1 P2
Data=[<Y = 1,t1, {X}>],
lastcommit=[ ]
Data=[<X = 1,t1, {Y}>],
lastcommit=[ ]
Prepared
Prepared
#DevoxxFR
RAMP – Fast (Read & Write)
53
Writer1 P1 P2
t1
Commit
lastcommit=[<X,t1>]
Data=[<Y = 1,t1, {X}>]Data=[<X = 1,t1, {Y}>]
lastcommit=[]
Reader1
(X, ∅)
Get
Get
(Y, ∅)
<X = 1,t1, {Y}>
<Y = ∅, 0>
lastCommit(X) = t1
lastCommit(Y) = 0
#DevoxxFR
RAMP – Fast (Read & Write)
54
Writer1 P1 P2
lastcommit=[<X,t1>]
Data=[<Y = 1,t1, {X}>]Data=[<X = 1,t1, {Y}>]
lastcommit=[]
Reader1
Max(t1, 0) = t1
Xt1 = 1 ,Yt1 = ?
Get
<Y = 1,t1, {X}>
(Y, t1)
Lookup t1 from Data
Max(t1, 0) = t1
Xt1 = 1,Yt1 = 1 ✔︎
Commit
t1 lastcommit=[<Y,t1>]
#DevoxxFR
RAMP – Fast (Read & Write)
55
Writer1 P1 P2
lastcommit=[<X,t1>]
Data=[<Y = 1,t1, {X}>]Data=[<X = 1,t1, {Y}>]
lastcommit=[]
Reader1
Max(t1, 0) = t1
Xt1 = 1 ,Yt1 = ?
Get
<Y = 1,t1, {X}>
(Y, t1)
Lookup t1 from Data
Max(t1, 0) = t1
Xt1 = 1,Yt1 = 1 ✔︎
Commit
t1 lastcommit=[<Y,t1>]
Si je vois une partition validée,
je peux voir toutes les
partitions liées, validées avec le
même timestamp ! (Tout)
#DevoxxFR
RAMP – Fast (Read & Write)
56
Writer1 P1 P2
lastcommit=[]
Data=[<Y = 1,t1, {X}>]Data=[<X = 1,t1, {Y}>]
lastcommit=[]
Reader1
(X, ∅)
Get
Get
(Y, ∅)
<X = ∅, 0>
<Y = ∅, 0>
lastCommit(X) = O
lastCommit(Y) = 0
#DevoxxFR
RAMP – Fast (Read & Write)
57
Writer1 P1 P2
lastcommit=[]
Data=[<Y = 1,t1, {X}>]Data=[<X = 1,t1, {Y}>]
lastcommit=[]
Reader1
(X, ∅)
Get
Get
(Y, ∅)
<X = ∅, 0>
<Y = ∅, 0>
lastCommit(X) = O
lastCommit(Y) = 0
Si aucune partition n’est encore
validée, toutes les partitions
liées retournent leur ancienne
valeur ! (Rien)
#DevoxxFR
RAMP – Fast (Cas d’erreur)
58
#DevoxxFR
RAMP – Fast (Cas d’erreur)
59
Le client tombe après commit(X, t1)
☞ processus de maintenance pour valider les autres
partitions pas encore validées (force-commit)
Le client tombe après le dernier prepare
☞ processus de maintenance pour nettoyer Data[ ]
après un timeout
#DevoxxFR
RAMP – Fast (Cas d’erreur)
60
Le client fait un rollback(ts) après le dernier prepare
☞ enlever les valeurs écrites à ts dans Data [ ]
#DevoxxFR
RAMP – Fast (Coût Disque)
61
La taille des méta-données est linéairement
proportionnelle au nombre de partitions impliquées dans
la transaction
0
1
2
3
4
5
6
7
8
Taille
méta
données
1 2 3 4 5 6 7 8
Nb de partitions
#DevoxxFR
RAMP – Fast Résumé
62
Algo RTT écriture RTT lecture (au mieux) RTT lecture (au pire) Taille méta-données
RAMP – Fast 2 1 2 O(#partitions)
#DevoxxFR
RAMP – Small (Prepare)
63
Writer P1 P2
WRITE <X = 1,t1>
Data=[ ], lastcommit=[ ]Data=[ ], lastcommit=[ ]WRITE X = 1
WRITE Y = 1
Prepare
Data=[<X = 1,t1]
WRITE <Y = 1,t1>
Prepare
Data=[<Y = 1,t1>]
#DevoxxFR
RAMP – Small (Prepare)
64
Writer P1 P2
Data=[<Y = 1,t1>],
lastcommit=[ ]
Data=[<X = 1,t1>],
lastcommit=[ ]
Prepared
Prepared
🔍 🔍
#DevoxxFR
RAMP – Small (Commit)
65
Writer P1 P2
t1
Commit
lastcommit=[<X,t1>]
Commit
Data=[<Y = 1,t1>]Data=[<X = 1,t1]
t1 lastcommit=[<Y,t1>]
#DevoxxFR
RAMP – Small (Commit)
66
Writer P1 P2
Data=[<Y = 1,t1>],
lastcommit=[<Y,t1>]
Data=[<X = 1,t1>],
lastcommit=[<X,t1>]
Committed
Committed
#DevoxxFR
RAMP – Small (Get round1)
67
Reader P1 P2
(X, ∅)
Get
Get
(Y, ∅)
lastcommit=[ <X,t1>]
Data=[<Y = 1,t1>,
<Y = 2,t2>]
Data=[<X = 1,t1>,
<X = 2, t2>]
lastcommit=[ <Y,t2>]
🔍 🔍
#DevoxxFR
RAMP – Small (Get round1)
68
Reader P1 P2
t1
lastcommit=[ <X,t1>]
Data=[<Y = 1,t1>,
<Y = 2,t2>]
Data=[<X = 1,t1>,
<X = 2, t2>]
t2
lastcommit=[ <Y,t2>]
#DevoxxFR
RAMP – Small (Get round2)
69
Reader P1 P2
(X, {t1,t2})
Get
Get
(Y, {t1,t2})
lastcommit=[ <X,t1>]
Data=[<Y = 1,t1>,
<Y = 2,t2>]
Data=[<X = 1,t1>,
<X = 2, t2>]
lastcommit=[ <Y,t2>]
#DevoxxFR
RAMP – Small (Get round2)
70
Reader P1 P2
lastcommit=[ <X,t1>]
Data=[<Y = 1,t1>,
<Y = 2,t2>]
Data=[<X = 1,t1>,
<X = 2, t2>]
lastcommit=[ <Y,t2>]
tmatch= {t | t∈(t1, t2)∧X∈Data
return X | tX = max(tmatch)
tmatch= {t | t∈(t1, t2)∧Y∈Data
return Y | tY = max(tmatch)
X = 2
Y = 2
#DevoxxFR
RAMP – Small Résumé
71
Algo RTT écriture RTT lecture (au mieux) RTT lecture (au pire) Taille méta-données
RAMP – Fast 2 1 2 O(#partitions)
RAMP – Small 2 2 2 0(1)
#DevoxxFR
RAMP – Small Résumé
72
Algo RTT écriture RTT lecture (au mieux) RTT lecture (au pire) Taille méta-données
RAMP – Fast 2 1 2 O(#partitions)
RAMP – Small 2 2 2 0(1)
Peut-on faire
mieux ?
#DevoxxFR
Bloom Filter Résumé
73
1 0 0 1* 0 0 1 0 1 1
Écriture X Y
Lecture Z ?
Faux positifs
Vrais négatifs
#DevoxxFR
RAMP – Hybrid (Prepare)
74
Writer P1 P2
WRITE <X = 1,t1, BFY>
Data=[ ], lastcommit=[ ]Data=[ ], lastcommit=[ ]WRITE X = 1
WRITE Y = 1
Prepare
Data=[<X = 1,t1, BFY>]
WRITE <Y = 1,t1, BFX>
Prepare
Data=[<Y = 1,t1, BFX>]
#DevoxxFR
RAMP – Hybrid (Get)
75
Reader P1 P2
(X, ∅)
Get
lastcommit=[ <X,t1>]
Get
Data=[<Y = 1,t1, BFX>]Data=[<X = 1,t1, BFY>]
(Y, ∅)
lastcommit=[ <Y,t1>]
#DevoxxFR
RAMP – Hybrid (Get)
76
Reader P1 P2
<X = 1,t1, BFY>
lastcommit=[ <X,t1>]
Data=[<Y = 1,t1, BFX>]Data=[<X = 1,t1, BFY>]
<Y = 1,t1, BFX>
lastcommit=[ <Y,t1>]
Max(t1, t1) = t1
Xt1 = 1
Yt1 = 1 ✔︎
#DevoxxFR
RAMP – Hybrid (Get)
77
Reader P1 P2
<X = 2,t2, BFY>
lastcommit=[ <X,t1>]
Data=[<Y = 1,t1, BFX>,
<Y = 2,t2, BFX>]
Data=[<X = 1,t1, BFY>,
<X = 2,t2, BFY>]
<Y = 1,t2, BFX>
lastcommit=[ <Y,t2>]
t2 > t1 ∧ X ∈ BFX ?
(X, t2)
Get
#DevoxxFR
RAMP – Hybrid (Get)
78
Reader P1 P2
<X = 2,t2, BFY>
lastcommit=[ <X,t1>]
Data=[<Y = 1,t1, BFX>,
<Y = 2,t2, BFX>]
Data=[<X = 1,t1, BFY>,
<X = 2,t2, BFY>]
<Y = 1,t2, BFX>
lastcommit=[ <Y,t2>]
t2 > t1 ∧ X ∈ BFX ?
(X, t2)
Get Faux positif possible!!!
#DevoxxFR
RAMP – Hybrid Résumé
79
Algo RTT écriture RTT lecture (au mieux) RTT lecture (au pire) Taille méta-données
RAMP – Fast 2 1 2 O(#partitions)
RAMP – Small 2 2 2 0(1)
RAMP – Hybrid 2 1 + 𝜀 2 Taille Bloom Filter
𝜀 = taux de faux positif
Proportionnel à la taille
du Bloom Filter
#DevoxxFR
Détails d’implémentation
80
Garbage collector
☞ limiter une transaction à N secondes. Effacer les
versions anciennes après N secondes
Gestion du timestamp
☞ mécanisme pour garantir une croissance monotone
stricte
#DevoxxFR
Détails d’implémentation
81
Réplication
☞ Attendre un ack pour N réplicas d’une partition (N
configurable)
Tâche de maintenance
☞ pour forcer un commit sur les partitions impliquées
dans une transaction ayant au moins 1 partition validée
#DevoxxFR
Quelles applications ?
82
Intégrité et contraintes de clés étrangères
Index secondaires globaux
Vues matérialisées
#DevoxxFR
Quelques implémentations
83
∅
#DevoxxFR
Quelques implémentations
84
∅
#DevoxxFR
Q & R
! "
#DevoxxFR
Merci
86
@doanduyhai
duy_hai.doan@datastax.com
http://academy.datastax.com/

Contenu connexe

Tendances

Devoxx 2016 - Dropwizard : Création de services REST production-ready
Devoxx 2016 - Dropwizard : Création de services REST production-readyDevoxx 2016 - Dropwizard : Création de services REST production-ready
Devoxx 2016 - Dropwizard : Création de services REST production-readyAlexander DEJANOVSKI
 
Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02
Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02
Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02Jérôme Mainaud
 
Consolidez vos journaux et vos métriques avec Elastic Beats
Consolidez vos journaux et vos métriques avec Elastic BeatsConsolidez vos journaux et vos métriques avec Elastic Beats
Consolidez vos journaux et vos métriques avec Elastic Beatsgcatt
 
Spark, ou comment traiter des données à la vitesse de l'éclair
Spark, ou comment traiter des données à la vitesse de l'éclairSpark, ou comment traiter des données à la vitesse de l'éclair
Spark, ou comment traiter des données à la vitesse de l'éclairAlexis Seigneurin
 
Cassandra pour les développeurs java
Cassandra pour les développeurs javaCassandra pour les développeurs java
Cassandra pour les développeurs javaJérémy Sevellec
 
Analytics et Big Data, une histoire de cubes...
Analytics et Big Data, une histoire de cubes...Analytics et Big Data, une histoire de cubes...
Analytics et Big Data, une histoire de cubes...Mathias Kluba
 
Delta Lake, un vernis pour parquet
Delta Lake, un vernis pour parquetDelta Lake, un vernis pour parquet
Delta Lake, un vernis pour parquetAlban Phélip
 
Oxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overviewOxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overviewLudovic Piot
 
DataStax et Cassandra dans Azure au Microsoft Techdays
DataStax et Cassandra dans Azure au Microsoft TechdaysDataStax et Cassandra dans Azure au Microsoft Techdays
DataStax et Cassandra dans Azure au Microsoft TechdaysVictor Coustenoble
 
Cassandra techniques de modelisation avancee
Cassandra techniques de modelisation avanceeCassandra techniques de modelisation avancee
Cassandra techniques de modelisation avanceeDuyhai Doan
 
ElasticSearch : Architecture et Développement
ElasticSearch : Architecture et DéveloppementElasticSearch : Architecture et Développement
ElasticSearch : Architecture et DéveloppementMohamed hedi Abidi
 
Spark SQL principes et fonctions
Spark SQL principes et fonctionsSpark SQL principes et fonctions
Spark SQL principes et fonctionsMICHRAFY MUSTAFA
 
Architecture Big Data open source S.M.A.C.K
Architecture Big Data open source S.M.A.C.KArchitecture Big Data open source S.M.A.C.K
Architecture Big Data open source S.M.A.C.KJulien Anguenot
 
Découverte de Redis
Découverte de RedisDécouverte de Redis
Découverte de RedisJEMLI Fathi
 

Tendances (20)

Devoxx 2016 - Dropwizard : Création de services REST production-ready
Devoxx 2016 - Dropwizard : Création de services REST production-readyDevoxx 2016 - Dropwizard : Création de services REST production-ready
Devoxx 2016 - Dropwizard : Création de services REST production-ready
 
Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02
Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02
Introduction à Apache Cassandra — IppEvent chez OVH 2017-03-02
 
Consolidez vos journaux et vos métriques avec Elastic Beats
Consolidez vos journaux et vos métriques avec Elastic BeatsConsolidez vos journaux et vos métriques avec Elastic Beats
Consolidez vos journaux et vos métriques avec Elastic Beats
 
Spark, ou comment traiter des données à la vitesse de l'éclair
Spark, ou comment traiter des données à la vitesse de l'éclairSpark, ou comment traiter des données à la vitesse de l'éclair
Spark, ou comment traiter des données à la vitesse de l'éclair
 
Cassandra pour les développeurs java
Cassandra pour les développeurs javaCassandra pour les développeurs java
Cassandra pour les développeurs java
 
Analytics et Big Data, une histoire de cubes...
Analytics et Big Data, une histoire de cubes...Analytics et Big Data, une histoire de cubes...
Analytics et Big Data, une histoire de cubes...
 
HADOOP + R
HADOOP + RHADOOP + R
HADOOP + R
 
Delta Lake, un vernis pour parquet
Delta Lake, un vernis pour parquetDelta Lake, un vernis pour parquet
Delta Lake, un vernis pour parquet
 
Oxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overviewOxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overview
 
Pgbackrest meetup
Pgbackrest meetupPgbackrest meetup
Pgbackrest meetup
 
DataStax et Cassandra dans Azure au Microsoft Techdays
DataStax et Cassandra dans Azure au Microsoft TechdaysDataStax et Cassandra dans Azure au Microsoft Techdays
DataStax et Cassandra dans Azure au Microsoft Techdays
 
Spark dataframe
Spark dataframeSpark dataframe
Spark dataframe
 
Cassandra techniques de modelisation avancee
Cassandra techniques de modelisation avanceeCassandra techniques de modelisation avancee
Cassandra techniques de modelisation avancee
 
ElasticSearch : Architecture et Développement
ElasticSearch : Architecture et DéveloppementElasticSearch : Architecture et Développement
ElasticSearch : Architecture et Développement
 
Chapitre 3 spark
Chapitre 3 sparkChapitre 3 spark
Chapitre 3 spark
 
Spark SQL principes et fonctions
Spark SQL principes et fonctionsSpark SQL principes et fonctions
Spark SQL principes et fonctions
 
Architecture Big Data open source S.M.A.C.K
Architecture Big Data open source S.M.A.C.KArchitecture Big Data open source S.M.A.C.K
Architecture Big Data open source S.M.A.C.K
 
Découverte de Redis
Découverte de RedisDécouverte de Redis
Découverte de Redis
 
Riak introduction
Riak introductionRiak introduction
Riak introduction
 
Webinar Degetel DataStax
Webinar Degetel DataStaxWebinar Degetel DataStax
Webinar Degetel DataStax
 

En vedette

Cassandra 3 new features 2016
Cassandra 3 new features 2016Cassandra 3 new features 2016
Cassandra 3 new features 2016Duyhai Doan
 
Algorithmique et programmation michael griffith
Algorithmique et programmation michael griffithAlgorithmique et programmation michael griffith
Algorithmique et programmation michael griffithBernhard Ndale
 
Le cryptage et le décryptage
Le cryptage et le décryptageLe cryptage et le décryptage
Le cryptage et le décryptageSKYWARE COMPAGNY
 
Les homophones grammaticaux
Les homophones grammaticauxLes homophones grammaticaux
Les homophones grammaticauxzeinabdibhammoud
 
Intelligence somatique pour coachs et facilitateurs - Fiche pédagogique
Intelligence somatique pour coachs et facilitateurs - Fiche pédagogiqueIntelligence somatique pour coachs et facilitateurs - Fiche pédagogique
Intelligence somatique pour coachs et facilitateurs - Fiche pédagogiqueMaud RABER
 
7exercices loi-normale-et-corriges-www.coursdefsjes.com
7exercices loi-normale-et-corriges-www.coursdefsjes.com7exercices loi-normale-et-corriges-www.coursdefsjes.com
7exercices loi-normale-et-corriges-www.coursdefsjes.comrachoo10
 
cours de complexité algorithmique
cours de complexité algorithmiquecours de complexité algorithmique
cours de complexité algorithmiqueAtef MASMOUDI
 
Algorithmique au cycle 3
Algorithmique au cycle 3Algorithmique au cycle 3
Algorithmique au cycle 3eduscol
 
TD La fonction logarithme exercices corrigés - SOUFIANE MERABTI
TD La fonction logarithme exercices corrigés -  SOUFIANE MERABTITD La fonction logarithme exercices corrigés -  SOUFIANE MERABTI
TD La fonction logarithme exercices corrigés - SOUFIANE MERABTIsoufiane merabti
 
Merise exercicesmcdcorriges-121007174045-phpapp01
Merise exercicesmcdcorriges-121007174045-phpapp01Merise exercicesmcdcorriges-121007174045-phpapp01
Merise exercicesmcdcorriges-121007174045-phpapp01SaberCraft Zeriguine
 
Implémentation des principaux algorithmes de chiffrements en Java
Implémentation des principaux algorithmes de chiffrements en JavaImplémentation des principaux algorithmes de chiffrements en Java
Implémentation des principaux algorithmes de chiffrements en JavaIbn Tofail University
 
Chap1 introduction à l'algoritmique
Chap1 introduction à l'algoritmiqueChap1 introduction à l'algoritmique
Chap1 introduction à l'algoritmiqueMohamed Lahby
 
Chapitre 3 NP-complétude
Chapitre 3 NP-complétudeChapitre 3 NP-complétude
Chapitre 3 NP-complétudeSana Aroussi
 
Cassandra introduction mars jug
Cassandra introduction mars jugCassandra introduction mars jug
Cassandra introduction mars jugDuyhai Doan
 

En vedette (20)

Cassandra 3 new features 2016
Cassandra 3 new features 2016Cassandra 3 new features 2016
Cassandra 3 new features 2016
 
Cassandra 3.0
Cassandra 3.0Cassandra 3.0
Cassandra 3.0
 
Algorithmique et programmation michael griffith
Algorithmique et programmation michael griffithAlgorithmique et programmation michael griffith
Algorithmique et programmation michael griffith
 
Le cryptage et le décryptage
Le cryptage et le décryptageLe cryptage et le décryptage
Le cryptage et le décryptage
 
Les homophones grammaticaux
Les homophones grammaticauxLes homophones grammaticaux
Les homophones grammaticaux
 
Algorithmique
AlgorithmiqueAlgorithmique
Algorithmique
 
Intelligence somatique pour coachs et facilitateurs - Fiche pédagogique
Intelligence somatique pour coachs et facilitateurs - Fiche pédagogiqueIntelligence somatique pour coachs et facilitateurs - Fiche pédagogique
Intelligence somatique pour coachs et facilitateurs - Fiche pédagogique
 
7exercices loi-normale-et-corriges-www.coursdefsjes.com
7exercices loi-normale-et-corriges-www.coursdefsjes.com7exercices loi-normale-et-corriges-www.coursdefsjes.com
7exercices loi-normale-et-corriges-www.coursdefsjes.com
 
cours de complexité algorithmique
cours de complexité algorithmiquecours de complexité algorithmique
cours de complexité algorithmique
 
Algorithmique au cycle 3
Algorithmique au cycle 3Algorithmique au cycle 3
Algorithmique au cycle 3
 
Exercices triphase
Exercices triphaseExercices triphase
Exercices triphase
 
Algorithme DPLL
Algorithme DPLLAlgorithme DPLL
Algorithme DPLL
 
TD La fonction logarithme exercices corrigés - SOUFIANE MERABTI
TD La fonction logarithme exercices corrigés -  SOUFIANE MERABTITD La fonction logarithme exercices corrigés -  SOUFIANE MERABTI
TD La fonction logarithme exercices corrigés - SOUFIANE MERABTI
 
Merise exercicesmcdcorriges-121007174045-phpapp01
Merise exercicesmcdcorriges-121007174045-phpapp01Merise exercicesmcdcorriges-121007174045-phpapp01
Merise exercicesmcdcorriges-121007174045-phpapp01
 
Implémentation des principaux algorithmes de chiffrements en Java
Implémentation des principaux algorithmes de chiffrements en JavaImplémentation des principaux algorithmes de chiffrements en Java
Implémentation des principaux algorithmes de chiffrements en Java
 
Chap1 introduction à l'algoritmique
Chap1 introduction à l'algoritmiqueChap1 introduction à l'algoritmique
Chap1 introduction à l'algoritmique
 
Rapport Projet Module Complexité
Rapport Projet Module ComplexitéRapport Projet Module Complexité
Rapport Projet Module Complexité
 
7 exercices-remediations-jc jost
7 exercices-remediations-jc jost7 exercices-remediations-jc jost
7 exercices-remediations-jc jost
 
Chapitre 3 NP-complétude
Chapitre 3 NP-complétudeChapitre 3 NP-complétude
Chapitre 3 NP-complétude
 
Cassandra introduction mars jug
Cassandra introduction mars jugCassandra introduction mars jug
Cassandra introduction mars jug
 

Similaire à Algorithme distribués pour big data saison 2 @DevoxxFR 2016

Corrige tp3 m3102_dut2
Corrige tp3 m3102_dut2Corrige tp3 m3102_dut2
Corrige tp3 m3102_dut2Youssef Rvd
 
Ippevent - Regarde les instances tomber - 20 mai 2014
Ippevent - Regarde les instances tomber - 20 mai 2014Ippevent - Regarde les instances tomber - 20 mai 2014
Ippevent - Regarde les instances tomber - 20 mai 2014vberetti
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11Microsoft
 
C# et .NET : Enigmes et puzzles
C# et .NET : Enigmes  et puzzlesC# et .NET : Enigmes  et puzzles
C# et .NET : Enigmes et puzzlesMicrosoft
 
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Normandy JUG
 
Apache Storm - Introduction au traitement temps-réel avec Storm
Apache Storm - Introduction au traitement temps-réel avec StormApache Storm - Introduction au traitement temps-réel avec Storm
Apache Storm - Introduction au traitement temps-réel avec StormParis_Storm_UG
 
Se noyer dans les yeux de Cassandre
Se noyer dans les yeux de CassandreSe noyer dans les yeux de Cassandre
Se noyer dans les yeux de CassandreMathieu Goeminne
 
DevoxxFR 2019: Consul @Criteo
DevoxxFR 2019: Consul @CriteoDevoxxFR 2019: Consul @Criteo
DevoxxFR 2019: Consul @CriteoPierre Souchay
 
Présentation CoreOS
Présentation CoreOSPrésentation CoreOS
Présentation CoreOSgcatt
 
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) univalence
 
Mat lab1
Mat lab1Mat lab1
Mat lab1fouadDD
 
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016Fabien Arcellier
 
WS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaWS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaOlivier BAZOUD
 
Spark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et CatalystSpark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et CatalystMathieu Goeminne
 
TD_complet_reseau__CISCO__Packet Tracer.pdf
TD_complet_reseau__CISCO__Packet Tracer.pdfTD_complet_reseau__CISCO__Packet Tracer.pdf
TD_complet_reseau__CISCO__Packet Tracer.pdfInes Ben Hassine
 

Similaire à Algorithme distribués pour big data saison 2 @DevoxxFR 2016 (20)

Corrige tp3 m3102_dut2
Corrige tp3 m3102_dut2Corrige tp3 m3102_dut2
Corrige tp3 m3102_dut2
 
Ippevent - Regarde les instances tomber - 20 mai 2014
Ippevent - Regarde les instances tomber - 20 mai 2014Ippevent - Regarde les instances tomber - 20 mai 2014
Ippevent - Regarde les instances tomber - 20 mai 2014
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11
 
Présentation de data.table
Présentation de data.tablePrésentation de data.table
Présentation de data.table
 
Python après 15 ans de JAVA
Python après 15 ans de JAVAPython après 15 ans de JAVA
Python après 15 ans de JAVA
 
C# et .NET : Enigmes et puzzles
C# et .NET : Enigmes  et puzzlesC# et .NET : Enigmes  et puzzles
C# et .NET : Enigmes et puzzles
 
Networxx (intro et fin)
Networxx (intro et fin)Networxx (intro et fin)
Networxx (intro et fin)
 
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
 
Apache Storm - Introduction au traitement temps-réel avec Storm
Apache Storm - Introduction au traitement temps-réel avec StormApache Storm - Introduction au traitement temps-réel avec Storm
Apache Storm - Introduction au traitement temps-réel avec Storm
 
Se noyer dans les yeux de Cassandre
Se noyer dans les yeux de CassandreSe noyer dans les yeux de Cassandre
Se noyer dans les yeux de Cassandre
 
DevoxxFR 2019: Consul @Criteo
DevoxxFR 2019: Consul @CriteoDevoxxFR 2019: Consul @Criteo
DevoxxFR 2019: Consul @Criteo
 
Présentation CoreOS
Présentation CoreOSPrésentation CoreOS
Présentation CoreOS
 
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
 
Cours de Matlab
Cours de MatlabCours de Matlab
Cours de Matlab
 
Mat lab1
Mat lab1Mat lab1
Mat lab1
 
4 si ds1 (algo)
4 si   ds1 (algo)4 si   ds1 (algo)
4 si ds1 (algo)
 
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
 
WS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaWS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - Xebia
 
Spark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et CatalystSpark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et Catalyst
 
TD_complet_reseau__CISCO__Packet Tracer.pdf
TD_complet_reseau__CISCO__Packet Tracer.pdfTD_complet_reseau__CISCO__Packet Tracer.pdf
TD_complet_reseau__CISCO__Packet Tracer.pdf
 

Plus de Duyhai Doan

Pourquoi Terraform n'est pas le bon outil pour les déploiements automatisés d...
Pourquoi Terraform n'est pas le bon outil pour les déploiements automatisés d...Pourquoi Terraform n'est pas le bon outil pour les déploiements automatisés d...
Pourquoi Terraform n'est pas le bon outil pour les déploiements automatisés d...Duyhai Doan
 
Big data 101 for beginners devoxxpl
Big data 101 for beginners devoxxplBig data 101 for beginners devoxxpl
Big data 101 for beginners devoxxplDuyhai Doan
 
Big data 101 for beginners riga dev days
Big data 101 for beginners riga dev daysBig data 101 for beginners riga dev days
Big data 101 for beginners riga dev daysDuyhai Doan
 
Datastax enterprise presentation
Datastax enterprise presentationDatastax enterprise presentation
Datastax enterprise presentationDuyhai Doan
 
Datastax day 2016 introduction to apache cassandra
Datastax day 2016   introduction to apache cassandraDatastax day 2016   introduction to apache cassandra
Datastax day 2016 introduction to apache cassandraDuyhai Doan
 
Datastax day 2016 : Cassandra data modeling basics
Datastax day 2016 : Cassandra data modeling basicsDatastax day 2016 : Cassandra data modeling basics
Datastax day 2016 : Cassandra data modeling basicsDuyhai Doan
 
Sasi, cassandra on the full text search ride At Voxxed Day Belgrade 2016
Sasi, cassandra on the full text search ride At  Voxxed Day Belgrade 2016Sasi, cassandra on the full text search ride At  Voxxed Day Belgrade 2016
Sasi, cassandra on the full text search ride At Voxxed Day Belgrade 2016Duyhai Doan
 
Apache cassandra in 2016
Apache cassandra in 2016Apache cassandra in 2016
Apache cassandra in 2016Duyhai Doan
 
Spark zeppelin-cassandra at synchrotron
Spark zeppelin-cassandra at synchrotronSpark zeppelin-cassandra at synchrotron
Spark zeppelin-cassandra at synchrotronDuyhai Doan
 
Sasi, cassandra on full text search ride
Sasi, cassandra on full text search rideSasi, cassandra on full text search ride
Sasi, cassandra on full text search rideDuyhai Doan
 
Cassandra 3 new features @ Geecon Krakow 2016
Cassandra 3 new features  @ Geecon Krakow 2016Cassandra 3 new features  @ Geecon Krakow 2016
Cassandra 3 new features @ Geecon Krakow 2016Duyhai Doan
 
Cassandra introduction 2016
Cassandra introduction 2016Cassandra introduction 2016
Cassandra introduction 2016Duyhai Doan
 
Spark cassandra integration 2016
Spark cassandra integration 2016Spark cassandra integration 2016
Spark cassandra integration 2016Duyhai Doan
 
Spark Cassandra 2016
Spark Cassandra 2016Spark Cassandra 2016
Spark Cassandra 2016Duyhai Doan
 
Cassandra introduction 2016
Cassandra introduction 2016Cassandra introduction 2016
Cassandra introduction 2016Duyhai Doan
 
Apache zeppelin the missing component for the big data ecosystem
Apache zeppelin the missing component for the big data ecosystemApache zeppelin the missing component for the big data ecosystem
Apache zeppelin the missing component for the big data ecosystemDuyhai Doan
 
Cassandra nice use cases and worst anti patterns no sql-matters barcelona
Cassandra nice use cases and worst anti patterns no sql-matters barcelonaCassandra nice use cases and worst anti patterns no sql-matters barcelona
Cassandra nice use cases and worst anti patterns no sql-matters barcelonaDuyhai Doan
 
Cassandra UDF and Materialized Views
Cassandra UDF and Materialized ViewsCassandra UDF and Materialized Views
Cassandra UDF and Materialized ViewsDuyhai Doan
 
Data stax academy
Data stax academyData stax academy
Data stax academyDuyhai Doan
 
Apache zeppelin, the missing component for the big data ecosystem
Apache zeppelin, the missing component for the big data ecosystemApache zeppelin, the missing component for the big data ecosystem
Apache zeppelin, the missing component for the big data ecosystemDuyhai Doan
 

Plus de Duyhai Doan (20)

Pourquoi Terraform n'est pas le bon outil pour les déploiements automatisés d...
Pourquoi Terraform n'est pas le bon outil pour les déploiements automatisés d...Pourquoi Terraform n'est pas le bon outil pour les déploiements automatisés d...
Pourquoi Terraform n'est pas le bon outil pour les déploiements automatisés d...
 
Big data 101 for beginners devoxxpl
Big data 101 for beginners devoxxplBig data 101 for beginners devoxxpl
Big data 101 for beginners devoxxpl
 
Big data 101 for beginners riga dev days
Big data 101 for beginners riga dev daysBig data 101 for beginners riga dev days
Big data 101 for beginners riga dev days
 
Datastax enterprise presentation
Datastax enterprise presentationDatastax enterprise presentation
Datastax enterprise presentation
 
Datastax day 2016 introduction to apache cassandra
Datastax day 2016   introduction to apache cassandraDatastax day 2016   introduction to apache cassandra
Datastax day 2016 introduction to apache cassandra
 
Datastax day 2016 : Cassandra data modeling basics
Datastax day 2016 : Cassandra data modeling basicsDatastax day 2016 : Cassandra data modeling basics
Datastax day 2016 : Cassandra data modeling basics
 
Sasi, cassandra on the full text search ride At Voxxed Day Belgrade 2016
Sasi, cassandra on the full text search ride At  Voxxed Day Belgrade 2016Sasi, cassandra on the full text search ride At  Voxxed Day Belgrade 2016
Sasi, cassandra on the full text search ride At Voxxed Day Belgrade 2016
 
Apache cassandra in 2016
Apache cassandra in 2016Apache cassandra in 2016
Apache cassandra in 2016
 
Spark zeppelin-cassandra at synchrotron
Spark zeppelin-cassandra at synchrotronSpark zeppelin-cassandra at synchrotron
Spark zeppelin-cassandra at synchrotron
 
Sasi, cassandra on full text search ride
Sasi, cassandra on full text search rideSasi, cassandra on full text search ride
Sasi, cassandra on full text search ride
 
Cassandra 3 new features @ Geecon Krakow 2016
Cassandra 3 new features  @ Geecon Krakow 2016Cassandra 3 new features  @ Geecon Krakow 2016
Cassandra 3 new features @ Geecon Krakow 2016
 
Cassandra introduction 2016
Cassandra introduction 2016Cassandra introduction 2016
Cassandra introduction 2016
 
Spark cassandra integration 2016
Spark cassandra integration 2016Spark cassandra integration 2016
Spark cassandra integration 2016
 
Spark Cassandra 2016
Spark Cassandra 2016Spark Cassandra 2016
Spark Cassandra 2016
 
Cassandra introduction 2016
Cassandra introduction 2016Cassandra introduction 2016
Cassandra introduction 2016
 
Apache zeppelin the missing component for the big data ecosystem
Apache zeppelin the missing component for the big data ecosystemApache zeppelin the missing component for the big data ecosystem
Apache zeppelin the missing component for the big data ecosystem
 
Cassandra nice use cases and worst anti patterns no sql-matters barcelona
Cassandra nice use cases and worst anti patterns no sql-matters barcelonaCassandra nice use cases and worst anti patterns no sql-matters barcelona
Cassandra nice use cases and worst anti patterns no sql-matters barcelona
 
Cassandra UDF and Materialized Views
Cassandra UDF and Materialized ViewsCassandra UDF and Materialized Views
Cassandra UDF and Materialized Views
 
Data stax academy
Data stax academyData stax academy
Data stax academy
 
Apache zeppelin, the missing component for the big data ecosystem
Apache zeppelin, the missing component for the big data ecosystemApache zeppelin, the missing component for the big data ecosystem
Apache zeppelin, the missing component for the big data ecosystem
 

Algorithme distribués pour big data saison 2 @DevoxxFR 2016

  • 2. #DevoxxFR Un peu de moi Duy Hai DOAN Evangéliste technique & consultant Apache Cassandra •  talks, meetups, confs •  projet open-source (Achilles, Apache Zeppelin) •  Des questions sur Apache Cassandra/Apache Zeppelin ? ☞ duy_hai.doan@datastax.com ☞ @doanduyhai 2
  • 3. #DevoxxFR Datastax •  Fondé en Avril 2010 •  Plus gros pourvoyeur de contributeur à Apache Cassandra™ •  Bureaux européens à Londres, Paris et Berlin •  Datastax Enterprise = OSS Cassandra + fonctionnalités+++ 3
  • 5. #DevoxxFR Le défi 5 Dans un système distribué, définir les conditions suffisantes à respecter pour garantir la convergence des données potentiellement désynchronisées
  • 6. #DevoxxFR Le défi 6 Dans un système distribué, définir les conditions suffisantes à respecter pour garantir la convergence des données potentiellement désynchronisées
  • 7. #DevoxxFR Le défi 7 Dans un système distribué, définir les conditions suffisantes à respecter pour garantir la convergence des données potentiellement désynchronisées
  • 8. #DevoxxFR Le défi 8 Dans un système distribué, définir les conditions suffisantes à respecter pour garantir la convergence des données potentiellement désynchronisées
  • 9. #DevoxxFR CRDT 9 Conflict-free Replicated Data Types Définit les conditions suffisantes pour un système "strong eventually consistent" Autorise une disponibilité extrême, N-1 nœuds en panne sur N nœuds au total
  • 10. #DevoxxFR 10 Types de CRDT À état: Convergent Replicated Data Types (CvRDT) Par fonction: Commutative Replicated Data Types (CmRDT)
  • 11. #DevoxxFR CvRDT: conditions d’application 11 Tous les réplicas sont connectés (en général) Échange d’état au moins 1 fois, sur un médium ponctuellement fiable L’ensemble des états forme un demi-treillis borné Tous les changements d’état transitionnent vers un nouvel état en suivant l’ordre partiel
  • 12. #DevoxxFR CvRDT: conditions d’application 12 Tous les réplicas sont connectés (en général) Échange d’état au moins 1 fois, sur un médium ponctuellement fiable L’ensemble des états forme un demi-treillis borné Tous les changements d’état transitionnent vers un nouvel état en suivant l’ordre partiel
  • 13. #DevoxxFR CvRDT: conditions d’application 13 Tous les réplicas sont connectés (en général) Échange d’état au moins 1 fois, sur un médium ponctuellement fiable L’ensemble des états forme un demi-treillis borné Tous les changements d’état transitionnent vers un nouvel état en suivant l’ordre partiel Ensemble d’éléments partiellement ordonnés ayant un borne supérieure (merci Wikipedia)
  • 14. #DevoxxFR CvRDT: conditions d’application 14 Tous les réplicas sont connectés (en général) Échange d’état au moins 1 fois, sur un médium ponctuellement fiable L’ensemble des états forme un demi-treillis borné Tous les changements d’état transitionnent vers un nouvel état en suivant l’ordre partiel
  • 16. #DevoxxFR CvRDT: définition 16 A join semilattice (or just semilattice hereafter) is a partial order ≤v equipped with a least upper bound (LUB) ⊔v, defined as follows: Definition 2.4 m = x ⊔v y is a least upper bound of {x, y} under ≤v iff x ≤v m and y ≤v m and there is no m′ ≤v m such that x ≤v m′ and y ≤v m′ It follows from the definition that ⊔v is: commutative: x ⊔v y =v y ⊔v x; idempotent: x ⊔v x =v x; and associative: (x⊔v y)⊔v z =v x⊔v (y⊔v z).
  • 18. #DevoxxFR CvRDT: exemple G-Set 18 Payload Set S, initial value S := { } Query(e) e ∈ S ? Update add(e): S := S ∪ {e} Merge(S’) S := S ∪ S’ relation d’ordre ≤v = ∈ opérateur ⊔v = ∪ l’union ensembliste ∪ est commutative, associative et idempotente
  • 19. #DevoxxFR relation d’ordre ≤v = ∈ opérateur ⊔v = ∪ l’union ensembliste ∪ est commutative, associative et idempotente CvRDT: exemple G-Set 19 Payload Set S, valeur initiale S := { } Query(e) e ∈ S ? Update add(e): S := S ∪ {e} Merge(S’) S := S ∪ S’ Problème: comment gérer les suppressions d’éléments dans le Set ?
  • 20. #DevoxxFR CvRDT: 2P-Set 20 Payload Set A, R initial value A := { } , R := { } Query(e) (e ∈ A) ∧ (e ∉ R) ? Update add(e): A := A ∪ {e}, remove(e): R := R ∪ {e} Merge(A’, R’) A := A ∪ A’, R := R ∪ R’
  • 21. #DevoxxFR CvRDT: LWW-Register 21 Payload (X, timestamp t), (∅, 0) Query(e) e = X ? Update assign(e): X := e, t := now() Merge((X’, t’)) If t’ < t then (X, t) else (X’, t’) à take value of max(timestamp)
  • 22. #DevoxxFR Quelles applications ? 22 Systèmes "eventually consistent" Compteurs distribués Graphes orientés a-cycliques Shopping Cart
  • 23. #DevoxxFR Quelques implémentations 23 Cassandra Last Write Win Riak GearPump RealTime Streaming Engine (LightBend) SoundCloud Roshi
  • 24. #DevoxxFR Cassandra LWW H A E D B C G F coordinateur INSERT/UPDATE 1 2 3 (X, t1) (X, t1) (X, t1) X
  • 25. #DevoxxFR Cassandra LWW H A E D B C G F 1 2 3 (X, t1)(X, t1) (X, t1) coordinateur INSERT/UPDATE Y (Y, t2)
  • 26. #DevoxxFR Cassandra LWW H A E D B C G F coordinateur SELECT 1 2 3 (X, t1)(Y, t2) (X, t1) Y
  • 27. #DevoxxFR Cassandra LWW Et si t1 == t2 ? (précision timestamp à la ms)  Les DELETE sont prioritaires sur les INSERT/UPDATE Comparer les valeurs par l’ordre de leur type (String, Date …) et prendre la valeur la plus élevée
  • 28. #DevoxxFR Et si t1 == t2 ? (précision timestamp à la ms)  Les DELETE sont prioritaires sur les INSERT/UPDATE Comparer les valeurs par l’ordre de leur type (String, Date …) et prendre la valeur la plus élevée Cette règle est-elle ? - commutative - associative - idempotente Cassandra LWW
  • 29. #DevoxxFR Cassandra LWW Associativité [("toto", t1), ("titi", t1)], ("tata",t1) à [("toto", t1), ("tata",t1)] à ("toto", t1)  ("toto", t1), [("titi", t1), ("tata",t1)] à [("toto", t1), ("titi",t1)] à ("toto", t1) Commutativité ("toto", t1), ("tata",t1) à ("toto", t1) ("tata", t1), ("toto",t1) à ("toto", t1) Idempotence ("toto", t1), ("toto",t1) à ("toto", t1)
  • 32. #DevoxxFR Le défi 32 Dans un système distribué, définir un algorithme garantissant des lectures atomiques sur des opérations multi-partitions
  • 33. #DevoxxFR Le défi 33 Dans un système distribué, définir un algorithme garantissant des lectures atomiques sur des opérations multi-partitions
  • 34. #DevoxxFR Le défi 34 Dans un système distribué, définir un algorithme garantissant des lectures atomiques sur des opérations multi-partitions Pas de garantie d’isolation ou d’écriture atomique
  • 35. #DevoxxFR Le défi 35 Dans un système distribué, définir un algorithme garantissant des lectures atomiques sur des opérations multi-partitions
  • 36. #DevoxxFR Solutions existantes 36 Lock global Multi-version concurrency control Optimistic concurrency control (Google F1)
  • 37. #DevoxxFR Un peu de théorie 37 Serializability Repeatable Read Cursor Stability Read Commited Read Uncommited Snapshot Isolation Linearizability Causal PRAM (Pipelined RAM) RYW (Read Your Write) Eventual Consistency
  • 38. #DevoxxFR Un peu de théorie 38 Serializability Repeatable Read Cursor Stability Read Commited Read Uncommited Snapshot Isolation Linearizability Causal PRAM (Pipelined RAM) RYW (Read Your Write) Eventual Consistency Coordination synchrone Sans Coordination
  • 39. #DevoxxFR Un peu de théorie 39 Serializability Repeatable Read Cursor Stability Read Commited Read Uncommited Snapshot Isolation Linearizability Causal PRAM (Pipelined RAM) RYW (Read Your Write) Eventual Consistency Coordination synchrone Sans Coordination RAMP Transactions
  • 40. #DevoxxFR Read Atomic Multi-Partitions Transaction Fournit une "visibilité atomique" ☞ Soit toutes les mises à jour d’une transaction sont visibles, soit aucune ne l’est RAMP Transaction 40
  • 41. #DevoxxFR Visibilité atomique par l’exemple 41 P1 P2 WRITE X = 1 WRITE Y = 1 READ X = 1 READ Y = 1 READ X = ∅ READ Y = ∅ Ou
  • 42. #DevoxxFR Visibilité atomique par l’exemple 42 P1 P2 WRITE X = 1 WRITE Y = 1 READ X = 1 READ Y = 1 READ X = ∅ READ Y = ∅ Ou ✘ ✘
  • 43. #DevoxxFR Idépendance de Partition ☞ les clients n’ont besoin de contacter que les partitions impliquées dans la transaction Idépendance de Synchronisation ☞ la transaction d’un client ne peut bloquer les autres clients. ☞ si le client peut accéder aux partitions de la transaction, la transaction sera réussie à terme. Garanties RAMP Transaction 43
  • 44. #DevoxxFR 2PC avec méta-données + multi-versioning limité Implémentation 44
  • 45. #DevoxxFR RAMP – Fast (Prepare) 45 Writer P1 P2 WRITE <X = 1,t1, {Y}> Data=[ ], lastcommit=[ ]Data=[ ], lastcommit=[ ]WRITE X = 1 WRITE Y = 1 Prepare Data=[<X = 1,t1, {Y}>] WRITE <Y = 1,t1, {X}> Prepare Data=[<Y = 1,t1, {X}>]
  • 46. #DevoxxFR RAMP – Fast (Prepare) 46 Writer P1 P2 Data=[<Y = 1,t1, {X}>], lastcommit=[ ] Data=[<X = 1,t1, {Y}>], lastcommit=[ ] Prepared Prepared
  • 47. #DevoxxFR RAMP – Fast (Commit) 47 Writer P1 P2 t1 Commit lastcommit=[<X,t1>] Commit Data=[<Y = 1,t1, {X}>]Data=[<X = 1,t1, {Y}>] t1 lastcommit=[<Y,t1>]
  • 48. #DevoxxFR RAMP – Fast (Commit) 48 Writer P1 P2 Data=[<Y = 1,t1, {X}>], lastcommit=[<Y,t1>] Data=[<X = 1,t1, {Y}>], lastcommit=[<X,t1>] Committed Committed
  • 49. #DevoxxFR RAMP – Fast (Get) 49 Reader P1 P2 (X, ∅) Get lastcommit=[ <X,t1>] Get Data=[<Y = 1,t1, {X}>]Data=[<X = 1,t1, {Y}>] (Y, ∅) lastcommit=[ <Y,t1>]
  • 50. #DevoxxFR RAMP – Fast (Get) 50 Reader P1 P2 <X = 1,t1, {Y}> lastcommit=[ <X,t1>] Data=[<Y = 1,t1, {X}>]Data=[<X = 1,t1, {Y}>] <Y = 1,t1, {X}> lastcommit=[ <Y,t1>] Max(t1, t1) = t1 Xt1 = 1 Yt1 = 1 ✔︎
  • 51. #DevoxxFR RAMP – Fast (Read & Write) 51 Writer1 P1 P2 WRITE <X = 1,t1, {Y}> Data=[ ], lastcommit=[ ]Data=[ ], lastcommit=[ ]WRITE X = 1 WRITE Y = 1 Prepare Data=[<X = 1,t1, {Y}>] WRITE <Y = 1,t1, {X}> Prepare Data=[<Y = 1,t1, {X}>]
  • 52. #DevoxxFR RAMP – Fast (Read & Write) 52 Writer1 P1 P2 Data=[<Y = 1,t1, {X}>], lastcommit=[ ] Data=[<X = 1,t1, {Y}>], lastcommit=[ ] Prepared Prepared
  • 53. #DevoxxFR RAMP – Fast (Read & Write) 53 Writer1 P1 P2 t1 Commit lastcommit=[<X,t1>] Data=[<Y = 1,t1, {X}>]Data=[<X = 1,t1, {Y}>] lastcommit=[] Reader1 (X, ∅) Get Get (Y, ∅) <X = 1,t1, {Y}> <Y = ∅, 0> lastCommit(X) = t1 lastCommit(Y) = 0
  • 54. #DevoxxFR RAMP – Fast (Read & Write) 54 Writer1 P1 P2 lastcommit=[<X,t1>] Data=[<Y = 1,t1, {X}>]Data=[<X = 1,t1, {Y}>] lastcommit=[] Reader1 Max(t1, 0) = t1 Xt1 = 1 ,Yt1 = ? Get <Y = 1,t1, {X}> (Y, t1) Lookup t1 from Data Max(t1, 0) = t1 Xt1 = 1,Yt1 = 1 ✔︎ Commit t1 lastcommit=[<Y,t1>]
  • 55. #DevoxxFR RAMP – Fast (Read & Write) 55 Writer1 P1 P2 lastcommit=[<X,t1>] Data=[<Y = 1,t1, {X}>]Data=[<X = 1,t1, {Y}>] lastcommit=[] Reader1 Max(t1, 0) = t1 Xt1 = 1 ,Yt1 = ? Get <Y = 1,t1, {X}> (Y, t1) Lookup t1 from Data Max(t1, 0) = t1 Xt1 = 1,Yt1 = 1 ✔︎ Commit t1 lastcommit=[<Y,t1>] Si je vois une partition validée, je peux voir toutes les partitions liées, validées avec le même timestamp ! (Tout)
  • 56. #DevoxxFR RAMP – Fast (Read & Write) 56 Writer1 P1 P2 lastcommit=[] Data=[<Y = 1,t1, {X}>]Data=[<X = 1,t1, {Y}>] lastcommit=[] Reader1 (X, ∅) Get Get (Y, ∅) <X = ∅, 0> <Y = ∅, 0> lastCommit(X) = O lastCommit(Y) = 0
  • 57. #DevoxxFR RAMP – Fast (Read & Write) 57 Writer1 P1 P2 lastcommit=[] Data=[<Y = 1,t1, {X}>]Data=[<X = 1,t1, {Y}>] lastcommit=[] Reader1 (X, ∅) Get Get (Y, ∅) <X = ∅, 0> <Y = ∅, 0> lastCommit(X) = O lastCommit(Y) = 0 Si aucune partition n’est encore validée, toutes les partitions liées retournent leur ancienne valeur ! (Rien)
  • 58. #DevoxxFR RAMP – Fast (Cas d’erreur) 58
  • 59. #DevoxxFR RAMP – Fast (Cas d’erreur) 59 Le client tombe après commit(X, t1) ☞ processus de maintenance pour valider les autres partitions pas encore validées (force-commit) Le client tombe après le dernier prepare ☞ processus de maintenance pour nettoyer Data[ ] après un timeout
  • 60. #DevoxxFR RAMP – Fast (Cas d’erreur) 60 Le client fait un rollback(ts) après le dernier prepare ☞ enlever les valeurs écrites à ts dans Data [ ]
  • 61. #DevoxxFR RAMP – Fast (Coût Disque) 61 La taille des méta-données est linéairement proportionnelle au nombre de partitions impliquées dans la transaction 0 1 2 3 4 5 6 7 8 Taille méta données 1 2 3 4 5 6 7 8 Nb de partitions
  • 62. #DevoxxFR RAMP – Fast Résumé 62 Algo RTT écriture RTT lecture (au mieux) RTT lecture (au pire) Taille méta-données RAMP – Fast 2 1 2 O(#partitions)
  • 63. #DevoxxFR RAMP – Small (Prepare) 63 Writer P1 P2 WRITE <X = 1,t1> Data=[ ], lastcommit=[ ]Data=[ ], lastcommit=[ ]WRITE X = 1 WRITE Y = 1 Prepare Data=[<X = 1,t1] WRITE <Y = 1,t1> Prepare Data=[<Y = 1,t1>]
  • 64. #DevoxxFR RAMP – Small (Prepare) 64 Writer P1 P2 Data=[<Y = 1,t1>], lastcommit=[ ] Data=[<X = 1,t1>], lastcommit=[ ] Prepared Prepared 🔍 🔍
  • 65. #DevoxxFR RAMP – Small (Commit) 65 Writer P1 P2 t1 Commit lastcommit=[<X,t1>] Commit Data=[<Y = 1,t1>]Data=[<X = 1,t1] t1 lastcommit=[<Y,t1>]
  • 66. #DevoxxFR RAMP – Small (Commit) 66 Writer P1 P2 Data=[<Y = 1,t1>], lastcommit=[<Y,t1>] Data=[<X = 1,t1>], lastcommit=[<X,t1>] Committed Committed
  • 67. #DevoxxFR RAMP – Small (Get round1) 67 Reader P1 P2 (X, ∅) Get Get (Y, ∅) lastcommit=[ <X,t1>] Data=[<Y = 1,t1>, <Y = 2,t2>] Data=[<X = 1,t1>, <X = 2, t2>] lastcommit=[ <Y,t2>] 🔍 🔍
  • 68. #DevoxxFR RAMP – Small (Get round1) 68 Reader P1 P2 t1 lastcommit=[ <X,t1>] Data=[<Y = 1,t1>, <Y = 2,t2>] Data=[<X = 1,t1>, <X = 2, t2>] t2 lastcommit=[ <Y,t2>]
  • 69. #DevoxxFR RAMP – Small (Get round2) 69 Reader P1 P2 (X, {t1,t2}) Get Get (Y, {t1,t2}) lastcommit=[ <X,t1>] Data=[<Y = 1,t1>, <Y = 2,t2>] Data=[<X = 1,t1>, <X = 2, t2>] lastcommit=[ <Y,t2>]
  • 70. #DevoxxFR RAMP – Small (Get round2) 70 Reader P1 P2 lastcommit=[ <X,t1>] Data=[<Y = 1,t1>, <Y = 2,t2>] Data=[<X = 1,t1>, <X = 2, t2>] lastcommit=[ <Y,t2>] tmatch= {t | t∈(t1, t2)∧X∈Data return X | tX = max(tmatch) tmatch= {t | t∈(t1, t2)∧Y∈Data return Y | tY = max(tmatch) X = 2 Y = 2
  • 71. #DevoxxFR RAMP – Small Résumé 71 Algo RTT écriture RTT lecture (au mieux) RTT lecture (au pire) Taille méta-données RAMP – Fast 2 1 2 O(#partitions) RAMP – Small 2 2 2 0(1)
  • 72. #DevoxxFR RAMP – Small Résumé 72 Algo RTT écriture RTT lecture (au mieux) RTT lecture (au pire) Taille méta-données RAMP – Fast 2 1 2 O(#partitions) RAMP – Small 2 2 2 0(1) Peut-on faire mieux ?
  • 73. #DevoxxFR Bloom Filter Résumé 73 1 0 0 1* 0 0 1 0 1 1 Écriture X Y Lecture Z ? Faux positifs Vrais négatifs
  • 74. #DevoxxFR RAMP – Hybrid (Prepare) 74 Writer P1 P2 WRITE <X = 1,t1, BFY> Data=[ ], lastcommit=[ ]Data=[ ], lastcommit=[ ]WRITE X = 1 WRITE Y = 1 Prepare Data=[<X = 1,t1, BFY>] WRITE <Y = 1,t1, BFX> Prepare Data=[<Y = 1,t1, BFX>]
  • 75. #DevoxxFR RAMP – Hybrid (Get) 75 Reader P1 P2 (X, ∅) Get lastcommit=[ <X,t1>] Get Data=[<Y = 1,t1, BFX>]Data=[<X = 1,t1, BFY>] (Y, ∅) lastcommit=[ <Y,t1>]
  • 76. #DevoxxFR RAMP – Hybrid (Get) 76 Reader P1 P2 <X = 1,t1, BFY> lastcommit=[ <X,t1>] Data=[<Y = 1,t1, BFX>]Data=[<X = 1,t1, BFY>] <Y = 1,t1, BFX> lastcommit=[ <Y,t1>] Max(t1, t1) = t1 Xt1 = 1 Yt1 = 1 ✔︎
  • 77. #DevoxxFR RAMP – Hybrid (Get) 77 Reader P1 P2 <X = 2,t2, BFY> lastcommit=[ <X,t1>] Data=[<Y = 1,t1, BFX>, <Y = 2,t2, BFX>] Data=[<X = 1,t1, BFY>, <X = 2,t2, BFY>] <Y = 1,t2, BFX> lastcommit=[ <Y,t2>] t2 > t1 ∧ X ∈ BFX ? (X, t2) Get
  • 78. #DevoxxFR RAMP – Hybrid (Get) 78 Reader P1 P2 <X = 2,t2, BFY> lastcommit=[ <X,t1>] Data=[<Y = 1,t1, BFX>, <Y = 2,t2, BFX>] Data=[<X = 1,t1, BFY>, <X = 2,t2, BFY>] <Y = 1,t2, BFX> lastcommit=[ <Y,t2>] t2 > t1 ∧ X ∈ BFX ? (X, t2) Get Faux positif possible!!!
  • 79. #DevoxxFR RAMP – Hybrid Résumé 79 Algo RTT écriture RTT lecture (au mieux) RTT lecture (au pire) Taille méta-données RAMP – Fast 2 1 2 O(#partitions) RAMP – Small 2 2 2 0(1) RAMP – Hybrid 2 1 + 𝜀 2 Taille Bloom Filter 𝜀 = taux de faux positif Proportionnel à la taille du Bloom Filter
  • 80. #DevoxxFR Détails d’implémentation 80 Garbage collector ☞ limiter une transaction à N secondes. Effacer les versions anciennes après N secondes Gestion du timestamp ☞ mécanisme pour garantir une croissance monotone stricte
  • 81. #DevoxxFR Détails d’implémentation 81 Réplication ☞ Attendre un ack pour N réplicas d’une partition (N configurable) Tâche de maintenance ☞ pour forcer un commit sur les partitions impliquées dans une transaction ayant au moins 1 partition validée
  • 82. #DevoxxFR Quelles applications ? 82 Intégrité et contraintes de clés étrangères Index secondaires globaux Vues matérialisées