Vous aimez ce que vous lisez sur ce blog ?
Envie d'aller plus loin avec véritable formation d'expertise en Java ?
Venez suivre ma formation Masterclasse Expertise Java !

"Même un développeur experimenté a besoin de continuer à apprendre. Et dans cette formation... j'ai appris beaucoup !" - A.G., Java Champion

Sessions intra-entreprises sur demande : contact[at]mokatech.net.
Inscrivez-vous vite !

OpenSource Exchange : compte-rendu sur Hadoop

Hadoop

Présentation réalisée par Oktay Istanbullu, ingénieur chez Yahoo!.

Présentation

Hadoop est un système de calcul distribué, créé par Doug Cutting à l'occasion du développement du moteur d'indexation Lucene. Depuis janvier 2008, Hadoop est un projet top-level de la fondation Apache.
Il est découpé en plusieurs sous-projets, dont :

  • HDFS + MapReduce : le coeur du système
  • HBase : une base de données distribuée
  • Pig : un langage permettant d'interroger HBase (équivalent de SQL pour les bases de données relationnelles, mais massivement parallélisable)
  • Zookeeper : un superviseur chargé de la coordination entre les composants, de la disponibilité et de la fiabilité du cluster.

Hadoop est né du besoin de Yahoo! d'une solution de "grid computing" performante et opensource. Il est maintenant utilisé par AOL, Facebook, Google, IBM, ImageShack, Last.fm...

Architecture

L'architecture d'Hadoop repose essentiellement sur deux éléments :

  • HDFS : Hadoop Distributed File System
  • MapReduce
HDFS

HDFS est un système de fichiers fistribué spécialisé dans la gestion de volumes de données importants. Et par important, il faut comprendre de l'ordre du Terabyte (1000Go) ou du Petabyte (un million de Go) ! C'est d'ailleurs l'un des deux pré-requis pour son utilisation, le second étant que le nombre de lectures des données doit être très supérieur au nombre d'écritures - l'idéal étant de ne plus jamais modifier les données après leur écriture initiale. Chez Yahoo!, c'est exactement le cas : les pages web lues ne sont évidemment pas modifiées lors de leur analyse.

Le principe général de HDFS est de découper les fichiers en fragments, qui seront répartis sur un cluster de serveurs de données (les DataNodes). Il revient à un "méta-serveur" (le NameNode) la charge de répertorier les fragments composant un fichier (ainsi que leurs réplicas), de gérer leur renommage et les opérations d'ouverture/fermeture, et de contrôler le bon fonctionnement des datanodes en surveillant leurs heartbeats. Ce système assure une bonne tolérance aux pannes sur des serveurs remplaçables (commodity hardware).

MapReduce

Le traitement de ces données est réalisé par des noeuds de calcul, distribués également, et qui sont choisis au plus près des données qu'ils doivent traiter, pour éviter toute surcharge du trafic réseau. Chaque noeud peut effectuer une tâche de type "map" ou "reduce" :

  • Une fonction "map" génère, à partir des données, des couples {clé logique | résultat partiel}. Par exemple, une fonction "map" comptant les mots d'un texte (ou d'une page web...) pourrait générer un couple {mot | 1} pour chaque mot trouvé, le 1 signifiant "1 occurrence du mot a été trouvée".
  • Une fonction "reduce" collecte et intègre l'ensemble des résultats partiels pour un clé logique donnée. Dans notre exemple, la fonction "reduce" pourrait incrémenter un compteur à chaque fois qu'un mot donné est émis par la fonction "map".

Afin de garantir l'intégrité des données sur un cluster, chaque calcul est effectué par plusieurs noeuds, et le premier noeud qui a terminé donne son résultat. Un serveur superviseur (le JobTracker) supervise l'ensemble et dispatche les unités de calcul sur les noeuds disponibles.

A noter

Quelques points intéressants :

  • Hadoop est développé en Java pour sa simplicité et sa puissance. Les problèmes de performance du langage même ne se posent pas, car de toute façon le goulet d'étranglement se situe toujours au niveau des accès disque et réseau.
  • Pour écrire les fonctions map et reduce, il supporte plusieurs langages comme Java, C++, Pig, et même le shell Unix.
  • Yahoo l'utilise sur plus de 17000 machines quadri-coeurs sous FreeBSD, réparties en clusters allant jusqu'à 4000 machines.
  • Hadoop est utilisé pour l'analyse des des pages web et des logs de recherche, ainsi que pour la gestion de la régie publicitaire. Concernant l'indexation web, le graphe des adresses connues par le moteur de Yahoo contient plus de 1000 milliards de noeuds !

Conclusion

Hadoop est un produit impressionnant mais généralement étranger à nos problématiques quotidiennes de développement d'applications de gestion...
Les ingénieurs de chez Yahoo nous ont invités à participer à son développement, mais je doute qu'un particulier ait chez lui plusieurs térabytes de données de tests, même si l'industrie du disque hurle au piratage musical !


Commentaires

1. Le mercredi 19 novembre 2008, 17:14 par HollyDays

«étranger à nos problématiques quotidiennes de développement d'applications de gestion...».
Vraiment ?

Tant que les développeurs écriront des applications fondamentalement synchrones et séquentielles, cela y restera étranger, je suis d'accord. Mais l'évolution des processeurs ces dernières années, et la direction que cette évolution prend pour les 5 ou 10 ans qui viennent (au bas mot) - en l'occurrence, une augmentation importante du nombre de cœurs dans chaque processeur - montre quelque chose de très différent : ainsi, Intel annonce un processeur à 80 cœurs à horizon de 5 ans.

Car comment exploiter le parallélisme disponible au niveau du matériel si on continue à écrire du code intrinsèquement et explicitement itératif et séquentiel ? Certes, les optimiseurs juste-à-temps sont puissants (VM et optimiseur interne du processeur), mais on atteint déjà les limites de leurs capacités prédictives. Pour accroître encore les performances, il va donc falloir que le code du développeur, à défaut d'être explicitement parallèle, soit au moins compatible avec une exécution parallèle.

Ces problématiques de code parallélisable ont été étudiées il y a longtemps déjà, et la réponse appropriée à ces problématiques est bien connue. Il ne s'agit pas des threads, qui sont une forme de parallélisation explicite, et qui sont complexes à maîtriser sans bugs pour le développeur. Il s'agit de la parallélisation implicite : le code ne dit pas ce qui doit être parallélisé, il se contente de ne pas présupposer un ordre d'exécution particulier.

Principal obstacle à cela : les structures de contrôle explicitement (et inutilement) séquentielles. Par exemple, en Java, parcourir des collections avec des Iterator pose un gros problème dans le processus de parallélisation du code : l'itérateur spécifie explicitement l'ordre de parcours des éléments de la collection, même lorsque le traitement sur chaque élément est indépendant de celui des autres. Et il n'y a pas vraiment moyen de garantir que ces traitements élémentaires sont indépendants et exécutables simultanément plutôt que séquentiellement.

Autre obstacle : les modifications de données partagées, qui sont vus comme autant d'effets de bord dans un monde parallèle.

Principal outil pour écrire du code implicitement parallélisable : des blocs de code sans effet de bord.

MapReduce utilise justement des blocs de code sans effet de bord, et c'est pour cela qu'il est massivement parallélisable, aussi bien à l'échelle d'une machine multi-cœurs qu'à l'échelle d'une grille de processeurs : chaque item de la fonction Map est indépendant des autres et peut être exécuté sur un cœur ou un processeur indépendant ; souvent, même Reduce peut être partiellement parallélisé (si on a N=n*m résultats à "réduire", on peut répartir le traitement sur n processeurs en les faisant réduire m résultats chacun ; puis on réduit ensuite les n réductions en une seule).

Comment exprime-t-on des blocs de code sans effet de bord ?
En Java, aujourd'hui, par des classes internes qui implémentent des interfaces comme Runnable. Ce qui est un peu verbeux dès lors qu'on veut en avoir un usage intensif.
Et dans les autres langages (Python, Groovy, Scala, ou même LISP, qui est le langage dans lequel on a inventé le MapReduce) ? Avec des closures.

2. Le mercredi 19 novembre 2008, 18:59 par Olivier Croisier

Le but de Hadoop n'est pas tant de paralléliser la puissance de calcul que de manipuler des volumes de données très importants. Ce n'est donc pas ce framework qui aidera à utiliser au mieux la puissance de calcul des ordinateurs multi-coeurs.

3. Le mardi 6 avril 2010, 15:32 par yahya

je vois que hadoop est très utile et il permet de résoudre beaucoup de problèmes.
moi je bosse sur un système de détection de fraudes bancaire.A votre avis sans hadoop comment pourrais-je traiter toutes ces données en temps réel.

4. Le mardi 6 avril 2010, 21:54 par Olivier Croisier

Cela dépend de votre besoin.

  • S'il faut manipuler des volumes très importants de données, et que celles-ci peuvent être réparties en sous-ensembles indépendants, alors une solution de type Hadoop ou GridGain pourra vous être utile.
  • Si au contraire les données ne peuvent être partitionnées et ne peuvent tenir en mémoire d'un seul bloc, Terracotta pourrait vous aider grâce à ses capacités de "paging" mémoire.
  • Enfin, si vous devez plutôt traiter des flux de données continus en temps réel, regardez du côté de Esper

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.