Présentation de MapReduce
By WORMS David
26 juin 2010
- Catégories
- Big Data
- Tags
- Java
- MapReduce
- Big Data
- JavaScript [plus][moins]
Ne ratez pas nos articles sur l'open source, le big data et les systèmes distribués, fréquence faible d’un email tous les deux mois.
Les systèmes d’information ont de plus en plus de données à stocker et à traiter. Des entreprises comme Google, Facebook, Twitter mais encore bien d’autre stockent des quantités d’information astronomiques en provenance de leurs clients et doivent être en mesure de les servir par les meilleurs recommandations tout en assurant la pérennité de leurs systèmes.
Description
MapReduce est un moyen de modéliser un programme pour traiter de larges volumes de donnée. Par large, on entend massif, par exemple de l’ordre du petabytes. Orginellement créé par Google et décrit en détails dans la publication ”MapReduce: Simplified Data Processing on Large Clusters” publiée en 2004, une implémentation Open Source existe au travers d’Hadoop et de son écosystème de la fondation Apache.
Une tâche MapReduce est constituée de 2 phases. Le développeur implémente une fonction “map” qui décompose une donnée en clé/valeur et une autre fonction “reduce” qui fusionne toutes les valeurs associées à une même clé. Combinées entre elles, ce paradigme permet d’exprimer un grand nombre de problématiques.
Le grand avantage de cette méthode est sa faculté à décomposer un processus en plusieurs tâches distribuables sur un très grand nombre de machines normales. Par machines normales, on entend des serveurs dont le prix peut varier entre 3000 et 5000 euros. Pour prendre un exemple concret, en 2010, nous avons commandé des serveurs à 4500 € constitués de 2 processors AMD Optéron à 8 coeurs, 32 Go de RAM et 4 disques de 1T à 7500 tours. Deux machines à 2000 euros chacune auraient très bien pu faire l’affaire. Nous avons opté pour cette configuration à cause de l’économie de place engendrée.
Le traitement des données est réparti sur l’ensemble des serveurs du cluster sans pénalité d’échelle. Si vos données doublent, vous doublez le nombre de machines. Si vous avez besoin de plus de puissance de calcul, idem.
Pour le programmeur, le travail se limite à la création de tâches MapReduce qui sont faciles à comprendre et à écrire. Le système se charge des détails dont le partitionnement des données, l’exécution et la coordination des tâches, la duplication des informations en cas de panne machine et la communication entre elles.
Je vais terminer cet article par un exemple en JavaScript pour illustrer le concept. Le but de l’exercice est de compter le nombre d’utilisateurs pour un même code postal, partant de données CSV comprenant 3 utilisateurs avec leur nom et leur code postal comme champs.
Le fichier source (format CSV)
Hadoop,75006
Cassandra,75019
Hive,75006
La fonction “map”
L’argument fourni, “value” correspond à une ligne de notre fichier source. Cette ligne est convertie sous forme d’array comprend 2 éléments : le nom de l’utilisateur et son code postal. Finalement, la fonction “emit” prend 2 arguments qui sont la clé à émettre et la valeur associée soit le code postal pour la clé et 1 pour signifier que ce code postal a été rencontré une fois.
function map(row){
row = row.split(',');
this.emit(row[1],1); }
La fonction “reduce”
Les argument fournis sont une clé et les valeurs associées à cette clé. Ils résultent de la fonction “map” appelée précédemment. L’argument “key” est donc un code postal et l’argument “values” une array de nombre. Attention toutefois, la fonction reduce peut être appelée plusieurs fois et son écriture doit prendre cela en compte. MapReduce étant destiné à de très larges volumes, values pourrait autrement prendre des proportions trop grandes. Ici, values est consituée de numéros “1” la première fois mais ce nombre sera différent si la méthode est appelée à nouveau.
function reduce(key,values){
return values.reduce(function(previous,current){
return previous + current
})
}
Le résultat final
75006, 2
75019, 1