Upload
ebiznext
View
448
Download
0
Embed Size (px)
Citation preview
RIAK ADMINISTRATION & DÉVELOPPEMENT
Hayssam Saleh h:ps://www.linkedin.com/in/hayssams @hayssams h:ps://github.com/ebiznext
21 novembre 2012
ADMINISTRATION SecMon 1/2
Installa1on / Exploita1on
NOSQL : THÉORÈME CAP
¢ Cohérence (Consistency) � Tous les nœuds du système voient exactement les mêmes
données au même moment ¢ Disponibilité (Availablity)
� Garan1e que les requêtes reçoivent une réponse même si un ou plusieurs nœuds sont défaillants
¢ Résistance au morcellement (Par11on Tolerance) � Aucune panne autre qu’une coupure réseau totale ne doit
empêcher le système de répondre. Idéalement, le système doit être en mesure de réconcilier les mises à jour une fois les nœuds à nouveaux accessibles les uns des autres
¢ Théorème de Brewer: � Un système distribué ne peut garan1r à un instant donné
que 2 de ces 3 contraintes.
LES QUORUMS ¢ Qorum
� Le nombre minimum de nœuds qui doivent répondre avec succès pour considérer que l’opéra1on s’est déroulée avec succès ¢ Permet de réconcilier la cohérence et la disponibilité.
� N ¢ Nombre de nœuds sur lesquels les données doivent être répliquées.
� R ¢ Les R premiers nœuds qui renvoient la valeur demandée ¢ R < N
� W ¢ Nombre de nœuds qui doivent répondre avec succès pour considérer que la créa1on/mise à jour a été effectuée avec succès
¢ W < N � Les performances sont directement liées à l’importance des valeurs R &
W. ¢ Cohérence et disponibilité
� Tolérer un nœud défaillant : N = 3, R = W = 2 � Tolérer deux nœuds défaillants : N = 5, R = W = 3
CONSISTENT HASHING ¢ Une clef est sur 160 bits ¢ La parMMonnement est réalisé
une fois pour toutes et devient DEFINITIF.
¢ Chaque par11on est gérée par un et un seul vnoeud
¢ Les vnoeud sont répar1s sur les noeuds physiques
¢ L’ajout ou le retrait d’un nœud physique amène le système à se reconfigurer en déplaçant des vnoeuds pour conserver une répar11on uniforme des par11ons.
¢ Nombre minimum de par11ons doit être de 10.
• 3 nœuds et 64 par11ons – 22 par11ons sur un nœud et 21 sur les deux autres.
• On ajoute 1 nœud supplémentaire – Le système se reconfigure pour avoir 16 par11ons par noeud.
VECTOR CLOCKS
¢ Chaque donnée est accompagnée d’un iden1fiant de nœud et d’un 1mestamp
¢ Quand deux clients mekent à jour la même donnée, on ob1ent une donnée avec deux vector clocks dis1ncts.
¢ La résolu1on est alors à l’ini1a1ve du client.
RIAK
¢ Une implémenta1on de Amazon Dynamo avec en plus : � La possibilité de lier les objets pour une naviga1on
associa1ve � Un moteur MapReduce programmable en JavaScript J ou
Erlang � Moteur de recherche en texte intégral compa1ble avec la
syntaxe Apache SOLR � Des index secondaires pour une recherche par akributs
INSTALLATION / EXPLOITATION
INSTALLATION SUR LINUX
¢ Installa1on sur RHEDL 6 � wget http://downloads.basho.com.s3-website-us-
east-1.amazonaws.com/riak/CURRENT/rhel/6/riak-1.2.1-1.el6.x86_64.rpm
� sudo rpm -Uvh riak-1.2.1-1.el6.x86_64.rpm
¢ Fichiers de configura1on � /etc/riak
¢ app.config ¢ vm.args
FICHIER DE CONFIGURATION VM.ARGS Nom DescripMon Valeur par défaut Valeur
## Désigne un commentaire
name Nom logique du nœud dans le cluster. A renommer impéra1vement sur chaque machine
[email protected] riak@adresseipdunoeud
setcookie Riak est développé en Erlang qui s’appuie sur un magic cookie pour autoriser deux nœuds à communiquer entre eux. Ce cookie doit être iden1que sur tous les noeuds du cluster
riak Valeur secrète spécifique à chaque cluster Riak et commune à tous les noeuds du cluster
heart Indique à riak que le nœud doit être redémarré lorsqu’il ne répond plus
Désac1vé Désac1vé
env ERL_CRASH_DUMP Répertoire de crash dump des noeuds RIAK
./log/erl_crash.dump
FICHIER DE CONFIGURATION APP.CONFIG Nom DescripMon Valeur par défaut Valeur
## Désigne un commentaire
ring_crea1on_size Taille de l’anneau. Ceke taille est défini1ve et détermine le nombre de par11ons par nœud physique.
64 3 nœuds : 64 5 nœuds : 128
ring_state_dir Répertoire contenant l’état de l’anneau.
./data/ring
hkp et hkps Liste d’adresses IP et de ports sur lesquels la webmachine RIAK répond aux requêtes.
[ {"127.0.0.1", 8098 } ] [ {"127.0.0.1", 8069 } ]
Pour HTTP [ {"127.0.0.1", 8098 }, { "monadressip", 8098 }] Pour HTTPS [ {"127.0.0.1", 8069 }, { "monadressip", 8069 }]
riak_kv/storage_backend Moteur de persistance à mekre en œuvre.
riak_kv_bitcask_backend riak_kv_eleveldb_backend
raw_name Racine de l’URL pour akeindre RIAK
riak riak
mapred_name Racine de l’URL pour akeindre le service de MapReduce
FICHIER DE CONFIGURATION APP.CONFIG Nom DescripMon Valeur par défaut Valeur
map_js_vm_count reduce_js_vm_count hook_js_vm_count
Nombre d eJVM disponible pour exécuter les services de map/reduce et hooks de pre-‐post commits
8 6 2
js_source_dir Répertoire contenant les fichiers JS à charger au démarrage des VM Javascript
/tmp/js_source
riak_search/enabled La recherche est-‐elle ac1vée {enabled, false} {enabled, true}
eleveldb/data_root Répertoire de données RIAK ./data/leveldb
crash_log Nom du fichier de crash log ./log/crash.log
crash_log_size Taille en octets du fichier de crash log avant rota1on
10485760 (10Mo)
crash_log_count Nombre de fichiers de crash log à conserver
5
FICHIER DE CONFIGURATION APP.CONFIG Nom DescripMon Valeur par défaut Valeur
inet_dist_listen_min inet_dist_listen_max
Intervalle de ports sur lesquels les nœuds RIAK communiquent entre eux
Exemple: { kernel, [ {inet_dist_listen_min, 10000}, {inet_dist_listen_max, 12999} ]},
FICHIER DE CONFIGURATION APP.CONFIG
Nom DescripMon Valeur par défaut Valeur
riak_control/enabled La console d’administra1on accessible sur l’url HTTPS à la racine admin est-‐elle disponible ?
{enabled, false} {enabled, true}
riak_control/auth Une authen1fica1on est-‐elle requise (valeurs possibles userlist ou none)
{auth, userlist} {auth, userlist}
riak_control/userlist Liste des u1lisateurs autorisés [{"user", "pass"}] [{"user1", "pass2"}, [{"user2", "pass2"}]]
FICHIER DE CONFIGURATION APP.CONFIG
Nom DescripMon Valeur par défaut Valeur
riak_api/pb_ip Adresse IP sur laquelle écoute RIAK pour le protocole PCB
127.0.0.1 Monadresseip
riak_api/pb_port Port dur PCB 8087
PCB VERSUS HTTP
¢ Riak peut être accédé en PB (ProtocolBuffer)ou en HTTP ¢ PB : protocole binaire très très performant ¢ HTTP : protocole facile à mekre au point, à u1liser en développement
¢ Certains services ne sont disponibles qu’en HTTP � SOLR API � index secondaires � Accès à certaines propriétés des buckets
MOTEUR DE PERSISTANCE ¢ Innostore
� Premier moteur RIAK � Présente l’inconvénient d’être une structure de données mutable. Les nœuds sont réorganisés au
fur et à mesure des écritures pour conserver les clefs triées dans le B-‐tree. � Obsolète
¢ Bitcask � Spécifique à RIAK � Une lecture / écriture requiert un seul accès disque � Toutes les clefs sont conservées en mémoire � Ne supporte pas les recherches sur les index secondaires
¢ LevelDB � Même principe que Bitcask pour les écritures � Avec un cache mémoire en plus � Par contre plusieurs accès peuvent être requis pour une lecture � Supporte les recherches sur les index secondaires � Beaucoup plus rapide qu’Innostore � La taille du cache (propriété elveldb/cache_size ) se calcule comme suit :
¢ (Free RAM / 2)/(nombre de par11ons/nombre de nœuds -‐FailNodes) � FailNodes correspond au nombre de nœuds qui peuvent échouer
¢ U1liser � Bitcask pour une performance maximale et un nombre de clefs « limité » � LevelDB pourun nombre de clefs « infini » et/ou faire de la recherche indexée
DIMENSIONNEMENT LEVELDB
¢ RAM disponible � U1lisée par l’OS comme mémoire tampon pour les accès
disque ¢ 25 à 35% réservée à l’OS si disque SSD ¢ 35 à 50% réservée à l’OS si disque mécaniques ¢ Sur un serveur avec 16G de RAM et des disques SSD
¢ 16Go * (1 – 0.3) = 11Go
¢ Mémoire par vnode ¢ Mémoire levelDB / nombre de vnodes ¢ Avec un anneau de 64 par11ons on ob1ent
� 11Go / 64 = 176 Mo par vnode
TUNING LEVELDB
¢ Surveiller la limite de handle de fichiers � 20 / par11on � Pour un anneau de 64 pari11ons => 1280 fichiers ouverts
¢ Limiter les accès disques en désac1vant noa1me � Ajouter noa1me dans /etc/fstab
¢ Valeurs recommandées /etc/sysctl.conf ¢ net.core.wmem_default=8388608 ¢ net.core.rmem_default=8388608
¢ net.core.wmem_max=8388608
¢ net.core.rmem_max=8388608
¢ net.core.netdev_max_backlog=10000 ¢ net.core.somaxconn=4000
¢ net.ipv4.tcp_max_syn_backlog=40000
¢ net.ipv4.tcp_fin_timeout=15 ¢ net.ipv4.tcp_tw_reuse=1
TUNING LEVELDB ¢ Block device scheduler
� Modifier le fichier /boot/grub/grub.conf comme suit : ¢ elevator=noop
� Le système de fichiers ext4 améliore l’intégrité des données mais diminue les performances. Nous pouvons nous passer du mécanisme offert par LINUX, l’intégrité étant assurée par la mul1plicité des nœuds RIAK. Mekre à jour le système de fichier ext4 avec les valeurs suivantes : ¢ barrier=0 ¢ data=writeback
¢ Désac1ver la sauvegarde d’énergie par varia1on de fréquence du processeur � cpufreq-‐selector –g performance
¢ Demander à l’OS de limiter au maximum le swap disque en modifiant dans /etc/sysctl.conf � vm.swappiness=0 � more /proc/sys/vm/swappiness #pour afficher sa valeur
BACKUP / RESTORE
¢ Backup � Arrêter le nœud � Sauvegarder le répertoire de données et de configura1on � Redémarrer le nœud
¢ Restore � Réinstaller RIAK � Restaurer les fichiers de configura1on et de données � Démarrer le nœud et vérifier le bon fonc1onnement
¢ riak ping ¢ riak-‐admin status
REJOINDRE / QUITTER UN CLUSTER ¢ Planifier une entrée dans un cluster
� Il suffit de lancer la commande ¢ riak-‐admin cluster join [email protected]
� Pour le moment, le nœud n’a pas encore rejoint le cluster, il s’agit juste d’une planifica1on
¢ Planifier la sor1e d’un nœud du cluster � riak-‐admin cluster leave [email protected] pour planifier la sor1e du noeud � riak-‐admin cluster force-‐remove [email protected] pour planifier la sor1e d’un
nœud sans l’arrêter « proprement » (des données pourront être perdues) ¢ Remplacer un nœud par un autre
� riak-‐admin cluster replace [email protected] [email protected] � riak-‐admin cluster force-‐replace [email protected] [email protected] � [email protected] devient le nœud ac1f et se voit assigner toutes les par11ons
¢ Pour afficher la liste des commandes planifiées � riad-‐admin cluster plan
¢ Pour exécuter les commandes planifiées � riak-‐admin cluster commit
¢ Pour les « oublier » � riak-‐admin cluster clear
RÉGULATION DE CHARGE SUR LE CLUSTER RIAK
¢ Masterless � Tout nœud RIAK est poten1ellement adressé des clients
¢ Régula1on de charge avec HA-‐PROXY � Exemple de configura1on pour les listeners HTTP
¢ server riak-‐1 192.168.0.1:8098 weight 1 maxconn 4096 ¢ server riak-‐1 192.168.0.2:8098 weight 1 maxconn 4096 ¢ server riak-‐1 192.168.0.3:8098 weight 1 maxconn 4096
� Exemple de configura1on pour les listeners PBC ¢ server riak-‐1 192.168.0.1:8097 weight 1 maxconn 4096 ¢ server riak-‐1 192.168.0.2:8097 weight 1 maxconn 4096 ¢ server riak-‐1 192.168.0.3:8097 weight 1 maxconn 4096
¢ Eviter que le régulateur de charge ne devienne un SPOF � HA-‐PROXY est installé et configuré sur chaque instance hébergeant un
serveur d’applica1on.
MONITORING DE RIAK ¢ RIAK peut être monitoré à l’URL /stats
� curl hkp://monadressip:8098/stats | pre�fy_json ¢ Format JSON
� Riak-‐admin status ¢ Format Erlang
¢ L’indicateur le plus important à suivre est le temps mis par une requête Riak dans les 60 dernières secondes � node_get/put_fsm_time_95 � node_get/put_fsm_time_99 � node_get/put_fsm_time_100 � node_get/put_fsm_time
¢ Interpréta1on � Les percen1les permekent de détecter le nombre de requêtes affectées par des problèmes temporaires de
performance ¢ Monitorer les performances : Compteurs FSM_Time
� Temps en microseconds que le code a mis pour traverser la machine à états finis. ¢ Prévoir le dimensionnement futur par le nombre de requêtes dans les 60 dernières secondes ou
depuis le démarrage du noeud � vnode_gets/puts(_total)
¢ Monitorer la taille des objets � Temps en microseconds que le code a mis pour traverser la machine à états finis. � node_get_fsm_objsize
MONITORING DE RIAK
¢ Explosion des copies mul1ples due à des latences importantes � node_get_fsm_sibling_{95/99/100/mean/median}
¢ Surveillance de la mémoire � Mem_total
� Mem_allocated
¢ Ou1l de diagnos1cs � Riaknos1c
RIAKNOSTIC
¢ Installa1on � Récupérer la dernière version sur hkps://github.com/basho/
riaknos1c/downloads � Copier
¢ sous RHEL dans le répertoire /usr/lib64/riak/lib ¢ Sous MacOS ./libexec/lib
� Pour un bilan complet ¢ riak-‐admin diag –level debug
� Vérifica1on de la configura1on disque ¢ riak-‐admin diag disk
� Des crashs ont-‐ils eu lieu ? ¢ riak-‐admin diag dumps
� Nombre de nœuds connectés en ce moment ¢ riak-‐admin diag nodes_connected
DÉVELOPPEMENT
SecMon 2/2
BUCKETS / CLEFS / VALEURS ¢ Clefs / Valeurs
� Riak est une base clef / valeur. � C’est une map dont
¢ les clefs sont des chaînes de caractères et ¢ les valeurs des données arbitraires.
¢ Buckets � Les couples clefs / valeurs sont stockés dans des buckets. � Un bucket permet de regrouper un sous-‐ensemble de clefs/valeurs � Aken1on : Un bucket n’existe pas physiquement, c’est juste une
commodité. En fait le nom du bucket est juxtaposé au nom de la clef pour cons1tuer une clef unique dans le système.
� Par contre certaines propriétés comme les règles de réplica1on sont posi1onnées au niveau des données.
CRUD RIAK VIA HTTP ¢ Créer un objet c’est créer une couple clef/valeur dans un bucket avec le protocole PUT
� curl -‐v -‐XPUT -‐d 'value' hkp://riakIP:riakPort/riak/monbucket/maclef
¢ Récupérer la valeur d’une clef � curl -‐v hkp:///riakIP:riakPort/riak/monbucket/maclef
¢ Modifier la valeur associée à une clef � Iden1que à la créa1on, si la clef existe déjà elle est remplacée. � curl -‐v -‐XPUT -‐d 'value' hkp://riakIP:riakPort/riak/monbucket/maclef
¢ Supprimer une clef � curl -‐v -‐X DELETE hkp://riakIP:riakPort/riak/monbucket/maclef
¢ Lister tous les buckets du cluster � curl -‐v hkp:///riakIP:riakPort/riak/buckets?buckets=true
¢ Lister toutes les clefs d’un bucket � curl –v hkp://riakHost:riakPort/buckets/monbucket/keys?keys=true � curl –v hkp://riakHost:riakPort/buckets/monbucket/keys?keys=stream
¢ U1liser stream lorsque le nombre de clefs est trop important. Riak renvoie alors les clefs au fur et à mesure de leur récupéra1on
� Ne jamais effectuer cet appel en produc1on
PROPRIÉTÉS D’UN BUCKET ¢ Ces propriétés sont partagées par toutes les clefs/valeurs du bucket. � curl –v hkp://riakHost:riakPort/buckets/monbucket/props { "props": { "name": ”monbucket", "allow_mult": false, "basic_quorum": false, "big_vclock": 50, "chash_keyfun": { "mod": "riak_core_u1l", "fun": "chash_std_keyfun" }, "dw": "quorum", "last_write_wins": false, "linkfun": { "mod": "riak_kv_wm_link_walker", "fun": "mapreduce_linkfun" }, "n_val": 3, "no�ound_ok": true, "old_vclock": 86400, "postcommit": [], "pr": 0, "precommit": [], "pw": 0, "r": "quorum", "rw": "quorum", "small_vclock": 50, "w": "quorum", "young_vclock": 20 } }
PROPRIÉTÉS D’UN BUCKET Propriété Valeur DescripMon
n_val Valeur en1ère posi1ve Nombre de replicas à créer pour les objets de ce bucket
allow_mult Booléen Des copies peuvent-‐elles cohabiter ? Autrement dit lorsque deux u1lisateurs tentent d’écrire en même temps la même la donnée, le système crée-‐t-‐il des doublons ? Par défaut ceke valeur est à false
last_write_wins Booléen La dernière valeur écrase la précédente. Si ceke propriété est à true alors allow_mult doit être à false et vice versa. Par défaut ceke valeur est à false
precommit
postcommit
r all/quorum/one ou une valeur en1ère < n_val
nombre de nœuds qui doivent répondre posi1vement à une lecture pour considérer que la lecture a réussi all -‐> tous les noeuds doivent répondre quorum -‐> plus de la moi1é des nœuds (n_val/2)+1. Valeur par défaut one -‐> 1
w all/quorum/one ou une valeur en1ère < n_val
nombre de nœuds qui doivent répondre posi1vement à une écriture pour considérer que l’écriture a réussi
rw all/quorum/one ou une valeur en1ère < n_val
nombre de nœuds qui doivent répondre posi1vement à une suppression pour considérer que la suppression a réussi (suppression = read suivi de write)
dw all/quorum/one ou une valeur en1ère < n_val
Nombre d’écriture effec1ve sur disque (post flush Riak plus précisément).
pr,pw all/quorum/one ou une valeur en1ère < n_val
Similaire à r,w mis à part que l’on exige que la confirma1on provienne de nœuds primaires.
PROPRIÉTÉS D’UN BUCKET Propriété Valeur DescripMon
backend String Nom du backend pour ce bucket.
precommit Tableau de fonc1ons Liste de fonc1ons JavaScript/Erlang à exécuter avant de valdier l’écriture (créa1on / mise à jour / suppression. Le type d’opéra1on est présent dans les metadata de l’objet passé en paramètre Renvoie l’objet modifié ou une erreur qui empêche alors l’écriture
postcommit Tableau de fonc1ons Idem precommit mais survient après l’écriture et donc sans valeur de retour.
VERSION D’OBJETS ¢ Une version d’objets est posi1onnée par le développeur. ¢ Ceke no1on doit être mise en œuvre uniquement si :
� Des mises à jour concurrentes d’un même objet peuvent survenir
¢ Dans tous les autres cas � last_write_wins=true
¢ Signifie ne pas u1liser les vector clocks ¢ Le 1mestamp suffit a déterminer la version la plus récente.
� allow_mult=false ¢ S’appuie sur les vector clocks pour effectuer la résolu1on après créa1on des copies.
¢ Donc les copies existent dans le système même si en apparence elles sont présentes.
¢ Préférer last_write_wins � Ges1on de sessions � Cache de données � Inser1on d’un volume important de données
VERSION D’OBJETS ¢ Pour éviter l’explosion de vector-‐clock, Riak va périodiquement purger des versions en fonc1on des paramètres suivants :
Propriété Valeur DescripMon
small_vclock
Nombre Si la liste de vclock est inférieure à ceke valeur alors elle ne sera pas purgée
big_vclock Nombre Si la liste est supérieure à ceke taille alors elle sera purgée
young_vlock old_vclock
Durée en secondes
Pour les listes dont la taille est comprise entre small_vclock et big_vclock, les entrées sont évaluées. Celles qui sont plus récentes que young_vclock sont conservées et celles qui sont plus anciennes que old_vclock sont purgées.
n si last_write_wins=true l Ce processus n’a pas lieu l Les Vclock n’existent tout simplement pas.
VERSION D’OBJETS ¢ Une version d’objets est posi1onnée par le développeur. ¢ Ceke no1on doit être mise en œuvre uniquement si :
� Des mises à jour concurrentes d’un même objet peuvent survenir
¢ Dans tous les autres cas � last_write_wins=true
¢ Signifie ne pas u1liser les vector clocks ¢ Le 1mestamp suffit a déterminer la version la plus récente.
� allow_mult=false ¢ S’appuie sur les vector clocks pour effectuer la résolu1on après créa1on des copies.
¢ Donc les copies existent dans le système même si en apparence elles sont présentes.
¢ Préférer last_write_wins � Ges1on de sessions � Cache de données
MAP REDUCE : UN PRINCIPE FONCTIONNEL
Map
Map
Map
Map
Map
Job'request Reduce
Combine
MAP REDUCE ¢ Exemple : Calculer le nombre de pages dans la catégorie AUTO accédées
entre le 1er janvier et le 7 janvier { "categories" : [ “Assurance”,” Auto”, “Promo1on” ], "interac1on" : { "age" : -‐1, "domain" : null, "name" : "INTERACTION_ID", "path" : null, "value" : "4b40�8b-‐55eb-‐4319-‐9745-‐fccfe2be8f88" }, "keywords" : [ “ASSUR” ], "nodePath" : "/sites/ACME-‐SPACE/home/community/publica1ons", "requestData" : { "accept" : "text/html,applica1on/xhtml+xml,applica1on/xml;q=0.9,*/*;q=0.8", "accept-‐charset" : "ISO-‐8859-‐1,u�-‐8;q=0.7,*;q=0.3", "accept-‐encoding" : "gzip,deflate,sdch", "accept-‐language" : "en-‐US,en;q=0.8,fr;q=0.6", "connec1on" : "keep-‐alive", "cookie" : "JSESSIONID=62b7421a-‐8e85-‐42aa-‐a0fd-‐816c34456502; INTERACTION_ID=4b40�8b-‐55eb-‐4319-‐9745-‐fccfe2be8f88", "host" : "127.0.0.1:8080", "ipAddress" : "127.0.0.1", "referer" : "hkp://127.0.0.1:8080/cms/en/sites/ACME-‐SPACE/home/ac1vi1es/satellites.html", "user-‐agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11" }, "sessionId" : "62b7421a-‐8e85-‐42aa-‐a0fd-‐816c34456502", "tags" : [ “Avantages” ], "1me" : 1353415058212, "userid" : " guest " }
MAP / REDUCE : UN EXEMPLE CONCRET ¢ Phase de Mapping : Un objet est à retenir s’il référence la catégorie Auto
var doTheMap = func1on(value) { try { var obj = Riak.mapValuesJson(value)[0]; if (obj.categories.indexOf("Auto") > -‐1 && new Date(2012,0,1).getTime() >= obj.1me && new Date(2012,0,7).getTime() <= obj.1me ) return [obj]; else return []; } catch (error) { return []; }
}
var reduceIt = func1on(values) { return [values.reduce(func1on(total, value) { return total + 1;}, 0)];
}
n Phase de Reduce : Compter le nombre de pages
n Lancer le Map/Reduce sur le bucket des visites
n Plusieurs phases de maps et de reduce peuvent être appliquées successivement n riak.add("visites").map(doTheMap1).map(doTheMap2). reduce(reduceIt1). reduce(reduceIt2).run()
riak.add("visites").map(doTheMap).reduce(reduceIt).run()
FILTRES ¢ Les performances de Riak sont très limités lorsqu’il s’agit de parcourir l’ensemble des données.
¢ Il est important de filtrer sur les clefs auparavant dans la mesure du possible
¢ Il est donc possible d’appliquer un prédicat après une éventuelle transforma1on afin de filtrer les données en entrée de l’opéra1on de MapReduce
{ "inputs":{ "bucket":”users", "key_filters":[["ends_with", ”@assur.fr"], ["ends_with", ”@assur.fr"]] } // ... Suite du job mapreduce }
FILTRES Nom
greater_than
less_than
greater_than_eq
between
neq
eq
set_member
similar_to Distance de Levenshtein
starts_with
ends_witj
and
or
not
TRANSFORMATIONS
Nom
int_to_string
string_to_int
float_to_string
string_to_float
to_upper
to_lower
tokenize
urldecode
n La clef peut être transformée avant applicaMon du filtre l Ces transforma1ons sont ajoutées en amont dans la liste des filtres.
EXEMPLES DE FILTRE n Toutes les requêtes réalisées par des <clients
{ "inputs":{ "bucket":”visites" "key_filters":[["tokenize", "-‐", 1],["eq", ”client"]] }, // ... }
n Toutes les requêtes réalisées dans la semaine { "inputs":{ "bucket":”visites" "key_filters":[["tokenize", "-‐", 2], ["between", "20120101", "201201307"]] }, // ... }
POINTS D’ATTENTION ¢ Concevoir de manière intelligente les clefs ¢ Filter / Filtrer / Filtrer ¢ Eviter le data-‐crunching
� Erlang est bon pour le scaker / gather � La JVM excelle pour les calculs intensifs
¢ Pour des volumes de données importants � Réaliser les fonc1ons de Map/Reduce en Erlang directement � Manque de courage ?
¢ Mul1plier les VM Javascript ¢ Préparer les données dans les hooks de postcommit