> De l'échantillonnage à « N = Tout »
> Conséquences sur les données
> Créer une application dans Java
> Principales fonctionnalités de MongoDB
> Établir des liens
2. Table des matières
• De l'échantillonnage à « N = Tout »
• Conséquences sur les données
• Créer une application dans Java
• Principales fonctionnalités de MongoDB
• Établir des liens
3. Exemple aléatoire
Source d'image : SurveyMonkey
Échantillonnage
• Basé sur l'échantillonnage
aléatoire
• Utilisation dans divers domaines :
sondages d'opinion, estimation
de bogue, etc.
Problèmes
• Perte de précision : marge d'erreur
de 3 %
• Les échantillons sont-ils fiables ?
• Les valeurs hors norme (ou
« aberrations ») peuvent apporter
des informations intéressantes
• Les événements rares ont un
impact important qui ne peut pas
être pris en compte lors d'une
distribution standard
4. N = Tout
Du rapport de cause à effet vers la
corrélation
De la cause à la conséquence
Un accès au monde numérique de plus
en plus courant
Le coût du stockage de données a
diminué avec le temps
La possibilité de traiter des informations
non structurées et semi-structurées
Des outils logiciels pouvant traiter des
données en temps réel
Source : Big Data : Viktor Mayer-Schönberger et Kenneth Cukier
5. Conséquence sur les données
Données
enrichies
(DE)
Diversité
des
données
(DvD)
Traitement
rapide
(TR)
Disponibili
té des
données
(DD)
Volume de
données
(VD)
Géospatial
(GS)
Accès en
temps réel
(ATR)
Durabilité
des
données
(DuD)
7. Exemples de besoins applicatifs
• Ensembles de compétences des employés
• Certification et niveau de compétence
• Affichage des données sur un tableau de
bord en temps réel
• Base de données fiable, performante et
offrant une scalabilité
9. Préparer l'application Java
• Ajouter les bibliothèques de pilotes aux nouvelles fonctionnalités
du Classpath 3.0
– Interface MongoCollection générique
– Nouvelle API asynchrone
– Nouvelle infrastructure de codec
– Nouveau pilote principal
• Démarrez l'instance de MongoDB. Nous allons commencer avec une instance
autonome. Pour un moteur de stockage performant pour l'écriture, démarrez
mongod en utilisant la chaîne –storageEngine wiredTiger
10. Créer l'objet Java
Ou utiliser
un Object-
Document
Mapper tel
que
Morphia
@Entity
public class coll {
@Id
private int id;
private String name;
@Embedded
private List<SkillsPOJO> skills;
@Embedded
private InfoPOJO info;
@Embedded
public class SkillsPOJO {
private String skill;
private int level;
private String version;
private boolean certified;
// Similarly for Info POJO
public class DataObject {
private int id;
private String name;
private List<SkillObject> obj;
private InfoObject info;
public class SkillObject {
private String skill;
private int level;
private String version;
private boolean certified;
public class InfoObject {
private String dept;
private int experience;
private List<Double> gps;
private String location;
private boolean reviewed;
11. Niveau de base de données
Se connecter à MongoDB
mongod
Client Java
Pilote
public void MongoConnect(String[] hosts) {
List<ServerAddress> seeds = new
ArrayList<ServerAddress>();
for (String h : hosts) {
// MongoDB Server address and Port
seeds.add(new ServerAddress(h));
}
// MongoDB client with internal connection pooling.
client = new MongoClient(seeds);
// The database to connect to
database = client.getDatabase("mydb");
// The collection to connect to
collection = database.getCollection("coll");
}
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
12. Ou utiliser un producteur de concepts d'origine
(ou ODM, pour Original Design Manufacturer)
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.mongodb.morphia.Datastore;
import org.mongodb.morphia.Morphia;
public void MorphiaConnect(String[] hosts) {
List<ServerAddress> seeds = new
ArrayList<ServerAddress>();
for (String h : hosts) {
seeds.add(new ServerAddress(h));
}
client = new MongoClient(seeds);
morphia = new Morphia();
// Map the Morphia Object
morphia.map(coll.class).map(SkillsPOJO.class).
map(InfoPOJO.class);
// Create a datastore to interact with MongoDB
// using POJOs
ds = morphia.createDatastore(client, "mydb");
}
Niveau de base de données
mongod
Client Java
Pilote
14. Effectuer quelques insertions
Avec Morphia
Document doc = new Document("_id", emplList.get(i).getId())
.append("name", emplList.get(i).getName())
.append("skills", skillBOList)
.append("info",
new Document("dept", info.getDept())
.append("yearsexp", info.getExperience())
.append("gps", info.getGPS())
.append("location", info.getLocation()));
collection.insertOne(doc);
import org.bson.Document;
import com.mongodb.client.MongoCollection;
public void insert(List<coll> emplList) throws InterruptedException {
ds.save(emplList);
}
DE
DvD
TR
DD
VD
GS
ATR
Du
D
15. Operations asynchrones
// Factory of MongoClient Instances
client = MongoClients.create("mongodb://localhost");
database = client.getDatabase("mydb");
collection = database.getCollection("coll");
…
// methods that cause network IO take a SingleResponseCallback<T> and return immediately
collection.insertOne(doc, new SingleResultCallback<Void>() {
@Override
public void onResult(final Void result, final Throwable t) {
System.out.println("Inserted!");
}
});
…
import com.mongodb.async.SingleResultCallback;
import com.mongodb.async.client.*;
DE
DvD
TR
DD
VD
GS
ATR
Du
D
16. Récupération des données
import static com.mongodb.client.model.Filters.*;
…
public void read(int id) {
Document myDoc = collection.find(eq("_id", id)).first();
System.out.println("Read Document with id: " + id + "n”
+ myDoc.toJson() + "n");
…
}
Avec Morphia
List<coll> empl = ds.createQuery(coll.class).filter("id =", id)
.asList();
DE
DvD
TR
DD
VD
GS
ATR
Du
D
17. Récupération d'un point de données
{ "_id" : 5,
"name" : "John Snow",
"skills" : [
{
"name" : "java",
"level" : 3,
"certified" : true
},
{
"name" : "mongo",
"level" : 5
}
],
"info" : {
"dept" : "A91",
"yearsexp" : 3,
"gps" : [-74.00597, 40.71427],
"location" : "New York"
}
}
DE
DvD
TR
DD
VD
GS
ATR
Du
D
18. Requête de géolocalisation
import static com.mongodb.client.model.Filters.*;
…
public void read(List<Double> gps, Double maxDistance, Double minDistance) {
double longitude = gps.get(0);
double latitude = gps.get(1);
collection.createIndex(new Document("info.gps", "2dsphere"));
MongoCursor<Document> cursor = collection.find(
near("info.gps", new Point(
new Position(longitude, latitude)),
maxDistance,
minDistance)).iterator();
while (cursor.hasNext()) {
…
}
…
}
DE
DvD
TR
DD
VD
GS
ATR
Du
D
19. Résultat de géolocalisation
• Requête pour obtenir tous les employés dans et autour de Boston
(coordonnées GPS : latitude 42,35843 ; longitude -71,05977), tandis
que le paramètre maxDistance est défini sur 400 000 Ms
{ "_id" : 5,
"name" : "John Snow",
"skills" : [
{
"name" : "java",
"level" : 3,
"certified" : true
},
{
"name" : "mongo",
"level" : 5
}
],
"info" : {
"dept" : "A91",
"yearsexp" : 3,
"gps" : [-74.00597, 40.71427],
"location" : "New York"
}
}
{ "_id" :45,
"name" : ”Jack Kingsley",
"skills" : [
{
"name" : ”c++",
"level" : 4
},
{
"name" : "mongo",
"level" : 2,
“version”: “3.0”
}
],
"info" : {
"dept" : ”A83",
"yearsexp" : 18,
"gps" : [-71.05977,
42.35843],
"location" : ”Boston"
}
}
DE
DvD
TR
DD
VD
GS
ATR
Du
D
20. Mise à jour des données
import static com.mongodb.client.model.Filters.*;
…
Map<String, Object> updateOps = new HashMap<String, Object>();
updateOps.put("$inc", new Document("info.yearsexp", 1));
updateOps.put("$set", new Document("info.reviewed", true));
result = collection.updateOne(eq("_id", id), new Document(updateOps));
Avec Morphia
Query<coll> query = ds.createQuery(coll.class).field("id").equal(id);
UpdateOperations<coll> ops = ds.createUpdateOperations(coll.class)
.inc("info.experience", 1)
.set("info.reviewed", true);
ds.update(query, ops);
DE
DvD
TR
DD
VD
GS
ATR
Du
D
21. Résultat de la mise à jour
• Le point de données a été examiné après 1 an de travail supplémentaire
{ "_id" : 5,
"name" : "John Snow",
"skills" : [
{
"name" : "java",
"level" : 3,
"certified" : true
},
{
"name" : "mongo",
"level" : 5
}
],
"info" : {
"dept" : "A91",
"yearsexp" : 3,
"gps" : [-74.00597, 40.71427],
"location" : "New York"
}
}
{ "_id" : 5,
"name" : "John Snow",
"skills" : [
{
"name" : "java",
"level" : 3,
"certified" : true
},
{
"name" : "mongo",
"level" : 5
}
],
"info" : {
"dept" : "A91",
"yearsexp" : 4,
"gps" : [-74.00597,
40.71427],
"location" : "New York”,
“reviewied” : true
}
}
DE
DvD
TR
DD
VD
GS
ATR
Du
D
22. Supprimer des données
Avec Morphia
import static com.mongodb.client.model.Filters.*;
…
public void delete(int id) {
collection.deleteOne(eq("_id", id));
System.out.println("Deleted Document with id: " + id + "n");
…
}
public void delete(int id) {
Query<coll> query = ds.createQuery(coll.class)
.field("id").equal(id);
ds.delete(query);
…
}
DE
DvD
TR
DD
VD
GS
ATR
Du
D
23. Jeu de réplicas
Haute disponibilité
Secondaire Secondaire
Primaire
Client Java
Pilote
✔✗
✔ ✔
Primaire
• Basculement
automatisé
• Mises à niveau
propagées
• Assistance
technique pour
plusieurs centres
de données
• Durabilité des
données et
cohérence forte
Duplication
Pulsation
Injoignable
DE
DvD
TR
DD
VD
GS
ATR
Du
D
24. Configuration de MongoDB
Utilisez MongoDB OpsManager ou l'automatisation de Cloud Manager pour configurer le
cluster
(ou)
sudo mongod --port 27017 --dbpath /data/rs1 --replSet rs --logpath /logs/rs1.log --fork
sudo mongod --port 27018 --dbpath /data/rs2 --replSet rs --logpath /logs/rs2.log --fork
sudo mongod --port 27019 --dbpath /data/rs3 --replSet rs --logpath /logs/rs3.log --fork
mongo --port 27017
> config = { "_id" : "rs", "members" : [
... {"host":"localhost:27017", "_id":0},
... {"host":"localhost:27018", "_id":1},
... {"host":"localhost:27019", "_id":2}
... ]
... }
rs.initiate(config)
Dans le programme Java,
transmettez les adresses
et les ports des membres
du jeu de réplicas en tant
que chaîne de connexion
DE
DvD
TR
DD
VD
GS
ATR
Du
D
25. Assurer la durabilité
• L'objet WriteConcern est reconnu
(Acknowledged) par défaut =>
l'opération d'écriture a été reçue et a
appliqué la modification en mémoire
• Une panne du serveur primaire peut
entraîner une perte de données
• Un objet WriteConcern plus strict, tel
qu'un paramètre Majority ou w:2
for (int retry = 0; retry < 3; retry++) {
try {
collection.withWriteConcern(WriteConcern.MAJORITY)
.insertOne(doc);
break;
} catch (Exception e) {
e.getMessage();
Thread.sleep(5000);
}
}
DE
DvD
TR
DD
VD
GS
ATR
Du
D
26. Cohérence finale
Application de
création de
rapports
Pilote
Jeu de réplicas
P
S S
• Procédez à la lecture à partir du nœud le plus proche
pour diminuer la latence
• Les applications en lecture seule où la cohérence finale
est OK, par exemple : applications de création de
rapports
• Peut être obtenue en utilisant l'objet ReadPreference
dans MongoDB
• Les modes sont Primary, PrimaryPreferred, Secondary,
SecondaryPreferred et Nearest
L'application de création
de rapports et le membre
secondaire sont sur le
même centre de données
myDoc = collection
.withReadPreference(ReadPreference.nearest())
.find(eq("_id", id)).first();
27. Meilleures pratiques pour la haute
disponibilité
• Haute disponibilité pour résoudre les pannes de centre de
données et alimenter les configurations de nœuds
actif/actif => 5 nœuds sur 3 centres de données
• Pour les opérations d'écriture => la plupart des nœuds
doivent être actifs
• Pour les opérations de lecture => les lectures secondaires
peuvent continuer
• Lorsque la plupart des nœuds sont inactifs => forcez la
reconfiguration pour continuer les opérations d'écriture
rs:SECONDARY> config = { "_id" : "rs", "members" : [
... {"host":"localhost:27018", "_id":1}
... ]
... }
rs:SECONDARY> rs.reconfig(config, {force:true})
{ "ok" : 1 }
rs:PRIMARY>
Jeu de réplicas
Supprimé Supprimé
Primaire
Client Java
Pilote
✔
✗✗
30. Niveau de base de données
Partitionnement
Partition 1
Client Java
Pilote
Partition 2
P
S S
P
S S
Routeur Routeur …
Niveau client
Serveur de
configuration
Serveur de
configuration
Serveur de
configuration
Partition N
P
S S
• Procédez à une montée en
charge en fonction de vos
besoins
• La redondance est intégrée à
tous les niveaux
• 3 types de partitionnement :
Range (Plage), Hashed (Haché)
ou Tag-Aware (basé sur la
position géographique)
DE
DvD
TR
DD
VD
GS
ATR
Du
D
31. Configuration de MongoDB
Utilisez MongoDB OpsManager ou l'automatisation de Cloud Manager pour configurer le cluster
(ou)
sudo mongod --port 37017 --dbpath /data/shard1 --logpath /logs/shard1.log –fork
sudo mongod --port 37018 --dbpath /data/shard2 --logpath /logs/shard2.log –fork
sudo mongod --port 47017 --dbpath /data/cfg —configsvr --logpath /logs/cfg.log –fork
sudo mongos --port 57017 --configdb localhost:47017
sudo mongos --port 57018 --configdb localhost:47017
mongo --port 57017
> sh.addShard("localhost:37017”)
> sh.addShard("localhost:37018”)
> sh.enableSharding("mydb”)
> sh.shardCollection("mydb.coll",{"_id":1})
Dans le programme Java,
transmettez les adresses
IP et les ports du routeur
en tant que chaîne de
connexion
DE
DvD
TR
DD
VD
GS
ATR
Du
D
32. MongoDB pour le Big Data
Données
enrichies
(DE)
Diversité
des
données
(DvD)
Traitement
rapide
(TR)
Disponibili
té des
données
(DD)
Volume de
données
(VD)
Géospatial
(GS)
Accès en
temps réel
(ATR)
Durabilité
des
données
(DuD)
Modèle de données
flexible et schéma
dynamique
Données
intégrées
Duplication native
entre les centres de
données
Objet
WriteConcern
adapté
Modèle de
requête et
fonction
d'agrégation
complets
Fonctionnalit
és
géospatiales
natives
Scalabilité
horizontale selon
vos besoins
Sous-documents,
tableaux, etc.
33. Pour en savoir plus : Java/MongoDB
Ressource Emplacement
Pilote Java MongoDB
http://docs.mongodb.com/ecosyst
em/drivers/java/
API Java pour se
connecter à MongoDB
http://api.mongodb.com/java/3.0/
Télécharger le pilote
http://mongodb.github.io/mongo-
java-driver/
Projet Morphia
https://github.com/mongodb/morp
hia
Pilote Hadoop pour
MongoDB
http://docs.mongodb.com/ecosyst
em/tools/hadoop/
Formation MongoDB
University
https://university.mongodb.com/co
urses/M101J/about?jmp=docs&_g
a=1.249916550.1866581253.1440
492145
34. Ressource Emplacement
Études de cas mongodb.com/customers
Présentations mongodb.com/presentations
Formation en ligne gratuite university.mongodb.com
Webinaires et événements mongodb.com/events
Documentation docs.mongodb.com
Téléchargements
MongoDB
mongodb.com/download
Informations
supplémentaires
info@mongodb.com
Pour en savoir plus : MongoDB
Pilote principal : API alternative
MongoDB Async Driver : une nouvelle API asynchrone qui peut exploiter l'objet AsynchronousSocketChannel de Netty ou Java 7 pour mettre en place des E/S rapides et sans blocage.
Netty est une infrastructure client-serveur d'entrée/sorte non bloquante (ou NIO, pour « Non-Blocking I/O ») permettant de développer des applications Java pour le réseau, telles que des serveurs et des clients de protocole.
Pool des connexions à la base de données, même avec plusieurs threads
MongoClientOptions.Builder()
connectionsPerHost
HeartbeatConnectTimeout
HeartbeatFrequency
MaxconnectionIdleTime
Pour créer une collection plafonnée -> createCollection (MaxDocuments, UsePowerof2Sizes, plafonnée), getCollection : repoussez la création jusqu'à l'écriture des données
Mécanisme de réponse aux problématiques de MongoDB
X509
Couche d'authentification et de sécurité simple (ou SASL, pour Simple Authentication and Security Layer) SCRAM
Kerberos
LDAP
insertMany
Cela s'applique également pour une fonction lambda avec Java 8
SingleResultCallback<T> : il s'agit d'une interface pour décrire la fin de l'exécution d'une opération asynchrone.
QueryFilter
Une position est la construction géométrique de base. Les « coordonnées » d'une entité géométrique se composent d'une position (pour une géométrie Point), d'un ensemble de positions (dans le cas des géométries LineString ou MultiPoint), d'un ensemble d'ensembles de positions (Polygones, MultiLineStrings) ou d'un ensemble multidimensionnel de positions (MultiPolygon)