{"id":684,"date":"2013-10-11T15:30:14","date_gmt":"2013-10-11T13:30:14","guid":{"rendered":"http:\/\/blog.khaledtannir.net\/?p=684"},"modified":"2013-10-11T15:30:14","modified_gmt":"2013-10-11T13:30:14","slug":"hadoop-et-mapreduce-introduction","status":"publish","type":"post","link":"https:\/\/khaledtannir.net\/en\/2013\/10\/11\/hadoop-et-mapreduce-introduction\/","title":{"rendered":"Introduction \u00e0 Hadoop 1\/2"},"content":{"rendered":"<p>Cet article sera le premier d&#8217;une s\u00e9rie qui pr\u00e9sentent la mise en oeuvre de ce syst\u00e8me ainsi que ses capacit\u00e9s adapt\u00e9 \u00e0 de grands volumes de donn\u00e9es (Big Data). Dans cette une introduction je vais expliquer les principes de Hadoop ainsi que son utilit\u00e9. Dans la suite des articles on se focalisera sur l&#8217;aspect pragmatique de ce framework par l&#8217;\u00e9laboration d&#8217;un exemple, dont le but sera de traiter un grand volume de donn\u00e9es. De m\u00eame, dans les prochains articles, on analysera la configuration et comment le mettre en place.<br \/>\n<!--more--><br \/>\n<strong>Qu&#8217;est-ce que c&#8217;est Hadoop ?<\/strong><br \/>\n<a href=\"http:\/\/hadoop.apache.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Hadoop<\/a> est l&#8217;acronyme du <em>High-availability distributed object-oriented platform<\/em>. Il s&#8217;agit d&#8217;une plate-forme open source qui fournit aussi bien les capacit\u00e9s de stockage que de traitement. La communaut\u00e9 <a href=\"http:\/\/www.apache.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Apache <\/a>(Yahoo) a repris\u00a0le mod\u00e8le MapReduce introduit par Google en 2004 et a propos\u00e9 sa solution open-source Hadoop .Cette solution\u00a0est\u00a0construite\u00a0autour de 2 concepts fondamenteaux : <strong>HDFS<\/strong> et <strong>MapReduce<\/strong>. Deux composantes\u00a0qu&#8217;on verra plus en d\u00e9tail par la suite.<\/p>\n<p>Bien qu&#8217;il puisse aussi bien s&#8217;installer et fonctionner sur une seule machine, la vraie puissance de Hadoop ne sera visible qu&#8217;\u00e0 partir d&#8217;un environnement compos\u00e9 de plusieurs ordinateurs (un cluster). Hadoop est donc la r\u00e9ponse \u00e0 un constat simple : la multiplication de l&#8217;espace disque ne va pas avec l&#8217;acc\u00e9l\u00e9ration de la lecture des donn\u00e9es. La solution serait alors de distribuer les donn\u00e9es en plusieurs parties pour les stocker sur plusieurs machines. L&#8217;enjeu se situe alors dans le m\u00e9canisme qui g\u00e8re l&#8217;acc\u00e8s partag\u00e9 \u00e0 cette ressource.<\/p>\n<p>Cependant, ce partage des ressources am\u00e8ne quelques nouvelles probl\u00e9matiques \u00e0 r\u00e9soudre telles que:\u00a0comment garantir l&#8217;int\u00e9grit\u00e9\u00a0des donn\u00e9es ?\u00a0comment composer correctement et rapidement une donn\u00e9e finale \u00e0 partir de plusieurs sources ? Hadoop apporte sa propre solution\u00a0\u00e0 ces deux probl\u00e9matiques \u00e0 travers ses concepts d\u00e9j\u00e0 mentionn\u00e9s : HDFS et MapReduce.<\/p>\n<div>\n<p style=\"text-align: center\">\/\/<\/p>\n<\/div>\n<p><strong>Qu&#8217;est-ce que c&#8217;est HDFS ?<\/strong><br \/>\nLe mod\u00e8le MapReduce ne d\u00e9finit aucun syst\u00e8me de fichier \u00e0 utiliser<em>. <strong>Hadoop Distributed Filesystem<\/strong><\/em> (<a href=\"http:\/\/hadoop.apache.org\/docs\/stable\/hdfs_design.html\" target=\"_blank\" rel=\"noopener noreferrer\">HDFS<\/a>) est un syst\u00e8me de fichiers distribu\u00e9 fournit par Hadoop.\u00a0HDFS\u00a0utilise le r\u00e9seau pour manipuler et\u00a0acc\u00e9der aux donn\u00e9es et\u00a0utilise les\u00a0ressources des autres ordinateurs clients\u00a0pr\u00e9sents sur\u00a0ce r\u00e9seau. De plus, HDFS est un syst\u00e8me de fichier adapt\u00e9 pour\u00a0travailler avec de tr\u00e8s grands volumes des donn\u00e9es tel que <a href=\"http:\/\/fr.wikipedia.org\/wiki\/BigTable\" target=\"_blank\" rel=\"noopener noreferrer\">Google BigTable<\/a> (1 GB et plus). Le grand plus de ce syst\u00e8me est l&#8217;universalit\u00e9. Il n&#8217;a pas besoin d&#8217;une machine tr\u00e8s puissante pour fonctionner correctement tout comme Il a \u00e9t\u00e9 con\u00e7u\u00a0pour fonctionner sur des machines &#8220;ordinaires&#8221;.<\/p>\n<p>Le syst\u00e8me\u00a0HDFS int\u00e8gre un m\u00e9canisme de tol\u00e9rances aux pannes, et peut ainsi garantir la disponibilit\u00e9 et l&#8217;int\u00e9grit\u00e9 des donn\u00e9es malgr\u00e9 une d\u00e9faillance syst\u00e8me (plantage d&#8217;une machine). Il permet un traitement rapide des fichiers d&#8217;une grande taille, cependant\u00a0HDFS est moins adapt\u00e9 aux fichiers de fichiers de petite taille.<\/p>\n<p>HDFS permet de rapprocher la lecture de la localisation des fichiers plut\u00f4t que de rapprocher les fichiers de la lecture (la localisation des donn\u00e9es est une probl\u00e9matique essentielle li\u00e9e au Big Data) ; en outre, il int\u00e8gre des interfaces qui permettent aux applications de localiser plus rapidement les ressources demand\u00e9es dans le cluster (ensemble des machines clientes).<\/p>\n<p>Un\u00a0<strong>block<\/strong>\u00a0 HDFS d\u00e9signe un portion de donn\u00e9es stock\u00e9e dans le syst\u00e8me de fichier. La taille d&#8217;un block est par d\u00e9faut de 64 MB (128 MB pour les versions plus r\u00e9centes de Hadoop), ce qui est sup\u00e9rieure \u00e0 celle des syst\u00e8mes de fichiers standards. Lorsque la taille d&#8217;une donn\u00e9e est inf\u00e9rieure \u00e0 64 MB, elle n\u2019occupe pas toute la taille du bloc, ce qui repr\u00e9sente une autre diff\u00e9rence par rapport aux syst\u00e8mes de fichiers standard.<\/p>\n<p>HDFS met en oeuvre le\u00a0pattern <em><strong>master-worker,<\/strong><\/em> lequel est\u00a0un mod\u00e8le\u00a0de traitement parall\u00e8le d&#8217;une ou de plusieurs op\u00e9rations \u00e0 travers plusieurs <strong><em>workers<\/em> <\/strong>et un <em><strong>master<\/strong> <\/em>(un mod\u00e8le similaire au mod\u00e8le client\/serveur). Dans HDFS, le master\u00a0orchestre toutes les op\u00e9rations et maintient la coh\u00e9rence des m\u00e9ta-donn\u00e9es, on l&#8217;appelle <strong>namenode<\/strong>. C&#8217;est lui qui r\u00e9ceptionne la demande du client et la passe directement \u00e0 ses workers appell\u00e9s\u00a0<strong>datanodes<\/strong>. Les datanodes stockent et r\u00e9cup\u00e8rent les blocs d\u00e9mand\u00e9s. Lors de la cr\u00e9ation d&#8217;un fichier au sein de HDFS, l&#8217;utilisateur peut sp\u00e9cifier un nombre de r\u00e9plication. Ainsi HDFS placera ces donn\u00e9es sur plusieurs datanodes ce qui permet leurs disponibilit\u00e9s pour les workers et une extraction plus rapide.<\/p>\n<div id=\"attachment_699\" style=\"width: 597px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/khaledtannir.net\/en\/wp-content\/uploads\/sites\/2\/2020\/05\/hdfsarchitecture.gif\"><img aria-describedby=\"caption-attachment-699\" loading=\"lazy\" class=\"  wp-image-699\" src=\"http:\/\/blog.khaledtannir.net\/wp-content\/uploads\/2013\/10\/hdfsarchitecture.gif\" alt=\"HDFS Architecture\" width=\"587\" height=\"406\" \/><\/a><p id=\"caption-attachment-699\" class=\"wp-caption-text\">HDFS Architecture<\/p><\/div>\n<p>&nbsp;<\/p>\n<p><strong>Qu&#8217;est-ce que c&#8217;est MapReduce ?<\/strong><br \/>\nComme on a d\u00e9j\u00e0 mentionn\u00e9, Hadoop est un syst\u00e8me de traitement parall\u00e8le des donn\u00e9es qui met en oeuvre le mod\u00e8le MapReduce lequel est un mod\u00e8le de programmation parall\u00e8le permettant de traiter de grands volumes de donn\u00e9es. Ce mod\u00e8le se base sur 2 \u00e9tapes principales:<\/p>\n<ul>\n<li><strong>Map()<\/strong>, ou \u00e9tape de mapping (map tasks) : le d\u00e9veloppeur d\u00e9finit une fonction de mappage dont le but sera d&#8217;analyser les donn\u00e9es brutes contenues dans les blocs de donn\u00e9es stock\u00e9s sur HDFS pour en sortir des donn\u00e9es &#8220;correctement format\u00e9es&#8221;. Les donn\u00e9es sont consid\u00e9r\u00e9es comme &#8220;correctement format\u00e9es&#8221; \u00e0 partir du moment o\u00f9 elles respectent la forme <strong>key-value<\/strong> (cl\u00e9-valeur).<\/li>\n<li><strong>Reduce()<\/strong>, ou \u00e9tape de r\u00e9duction (reduce tasks) : cette t\u00e2che r\u00e9cup\u00e8re les donn\u00e9es construites dans l&#8217;\u00e9tape du mappage et s&#8217;occupe de les agr\u00e9ger. Les tri et les regroupement sont effectu\u00e9s par Hadoop avant de pr\u00e9senter les donn\u00e9es aux reducers.\u00a0 Les reducers vont tous collaborer pour produire le r\u00e9sultat final (les donn\u00e9es en sortie).<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Pour illustrer ce processus, on peut imaginer qu&#8217;on poss\u00e8de plusieurs livres (au format texte) et l&#8217;objectif \u00e9tant de calculer le nombre d&#8217;apparition de chacun des mots de ces livres. Pour ce faire, notre fonction\u00a0 <em><strong>map<\/strong>\u00a0<\/em>peut traiter les fichiers et produire une ou plusieurs listes des mots ayant apparus dans chaque livre. Ensuite la fonction de <em><strong>reduce<\/strong> <\/em>groupera ces listes par mot et calculera le total pour chaque mot. Le r\u00e9sultat sera produit sous forme d&#8217;une liste. Le but de jeu est que toutes ces op\u00e9ration soient effectu\u00e9es sur plusieurs machines tout en gardant les r\u00e9sultats corrects.<\/p>\n<p>Gr\u00e2ce \u00e0 cette parall\u00e9lisation, le temps de calcul sera totalement optimis\u00e9.<br \/>\nEntre ces deux processus peuvent s&#8217;incruster d&#8217;autres, comme les filtres ou\u00a0<em>combiner functions<\/em>. Ceux-ci seront pr\u00e9sent\u00e9s plus en d\u00e9tail dans l&#8217;article qui abordera MapReduce.<\/p>\n<div id=\"attachment_701\" style=\"width: 617px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/khaledtannir.net\/en\/wp-content\/uploads\/sites\/2\/2020\/05\/3529146657_5b5d025a5f_o.png\"><img aria-describedby=\"caption-attachment-701\" loading=\"lazy\" class=\"  wp-image-701\" src=\"http:\/\/blog.khaledtannir.net\/wp-content\/uploads\/2013\/10\/3529146657_5b5d025a5f_o.png\" alt=\"MapReduce\" width=\"607\" height=\"393\" \/><\/a><p id=\"caption-attachment-701\" class=\"wp-caption-text\">MapReduce<\/p><\/div>\n<p><strong>Conclusion<\/strong><br \/>\nCet\u00a0 article nous a permis d&#8217;introduire\u00a0le\u00a0traitement des fichiers dans un syst\u00e8me de fichiers distribu\u00e9. On a vu que HDFS et MapReduce sont deux composantes\u00a0importantes du\u00a0syst\u00e8me Hadoop. Les articles suivants aborderont la mise en place et la configuration de Hadoop.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cet article sera le premier d&#8217;une s\u00e9rie qui pr\u00e9sentent la mise en oeuvre de ce syst\u00e8me ainsi que ses capacit\u00e9s adapt\u00e9 \u00e0 de grands volumes de donn\u00e9es (Big Data). Dans cette une introduction je vais expliquer les principes de Hadoop ainsi que son utilit\u00e9. Dans la suite des articles on se focalisera sur l&#8217;aspect pragmatique [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":3528,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[60,61],"tags":[70,77,80],"_links":{"self":[{"href":"https:\/\/khaledtannir.net\/en\/wp-json\/wp\/v2\/posts\/684"}],"collection":[{"href":"https:\/\/khaledtannir.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/khaledtannir.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/khaledtannir.net\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/khaledtannir.net\/en\/wp-json\/wp\/v2\/comments?post=684"}],"version-history":[{"count":0,"href":"https:\/\/khaledtannir.net\/en\/wp-json\/wp\/v2\/posts\/684\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/khaledtannir.net\/en\/wp-json\/wp\/v2\/media\/3528"}],"wp:attachment":[{"href":"https:\/\/khaledtannir.net\/en\/wp-json\/wp\/v2\/media?parent=684"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/khaledtannir.net\/en\/wp-json\/wp\/v2\/categories?post=684"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/khaledtannir.net\/en\/wp-json\/wp\/v2\/tags?post=684"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}