<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Big Data France</title><link>http://blogs.msdn.com/b/big_data_france/</link><description /><dc:language>en-US</dc:language><generator>Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><item><title>La machine apprend et vous recommande des choses</title><link>http://blogs.msdn.com/b/big_data_france/archive/2013/05/15/la-machine-apprend-et-vous-recommande-des-choses.aspx</link><pubDate>Wed, 15 May 2013 14:47:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10418927</guid><dc:creator>Philippe Beraud - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/big_data_france/rsscomments.aspx?WeblogPostID=10418927</wfw:commentRss><comments>http://blogs.msdn.com/b/big_data_france/archive/2013/05/15/la-machine-apprend-et-vous-recommande-des-choses.aspx#comments</comments><description>&lt;p align="justify"&gt;&lt;em&gt;&lt;a href="http://blogs.msdn.com/b/benjguin/default.aspx?PostSortBy=MostViewed&amp;amp;PageIndex=1"&gt;Benjamin Guineberti&amp;egrave;re&lt;/a&gt;, &amp;eacute;vang&amp;eacute;liste Microsoft et co-administrateur de ce blog, nous propose un article sur l&amp;rsquo;apprentissage automatique avec &lt;a href="http://mahout.apache.org/"&gt;Mahout&lt;/a&gt; qui vient compl&amp;eacute;ter notre premi&amp;egrave;re incursion dans le domaine du Machine Learning. &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmez.com/"&gt;&lt;em&gt;&lt;img style="border: 0px currentcolor; display: inline; background-image: none;" title="CMJN de base" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/8306.clip_5F00_image001_5F00_0B95A174.jpg" alt="CMJN de base" width="220" height="46" border="0" /&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Cet article paru dans le &lt;/em&gt;&lt;em&gt;&lt;a href="http://www.programmez.com/magazine_articles.php?titre=La-machine-apprend-et-vous-fait-des-recommandations&amp;amp;id_article=1839&amp;amp;magazine=160"&gt;Magazine Programmez n&amp;deg;160&lt;/a&gt; est reproduit ici avec l&amp;rsquo;aimable autorisation de &lt;a href="http://www.programmez.com/"&gt;Programmez&lt;/a&gt; que nous remercions au passage. (L&amp;rsquo;article a &amp;eacute;t&amp;eacute; l&amp;eacute;g&amp;egrave;rement amend&amp;eacute; de fa&amp;ccedil;on &amp;agrave; prendre en compte la version B&amp;ecirc;ta publique courante de &lt;a href="http://www.windowsazure.com/en-us/manage/services/hdinsight/"&gt;Windows Azure HDInsight&lt;/a&gt;.)&lt;/em&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;em&gt;Pour celles et ceux qui ne connaitraient pas encore Programmez, ce dernier propose un nouveau magazine tous les mois traitant de l&amp;rsquo;univers du d&amp;eacute;veloppement informatique, abordant toutes technologies sous forme de dossiers, articles, et tutoriels. Sa renomm&amp;eacute;e s&amp;rsquo;est &amp;eacute;tablie sur des articles de qualit&amp;eacute;s et traitant de sujets d&amp;rsquo;actualit&amp;eacute;s ou en avance de phase. &lt;/em&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;em&gt;Dans le contexte de ce blog, nous vous invitons tout particuli&amp;egrave;rement &amp;agrave; consulter le&lt;/em&gt;&lt;em&gt; &lt;a href="http://www.programmez.com/magazine.php?num_magazine=160"&gt;sommaire&lt;/a&gt; de ce num&amp;eacute;ro (160) dans lequel se trouvent trois articles abordant diff&amp;eacute;rents aspects d&amp;rsquo;Hadoop.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/4532.image_5F00_35959F9C.png"&gt;&lt;img style="border: 0px currentcolor; display: inline; background-image: none;" title="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/0880.image_5F00_thumb_5F00_6F383986.png" alt="image" width="111" height="152" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;em&gt;Si vous avez besoin d&amp;rsquo;une explication sur ce qu&amp;rsquo;est le l&amp;rsquo;apprentissage automatique, le billet&lt;/em&gt;&lt;em&gt; &lt;a href="http://blogs.msdn.com/b/big_data_france/archive/2013/04/24/apprentissage-automatique-machine-learning.aspx"&gt;Apprentissage automatique (Machine Learning)&lt;/a&gt; explique les principes fondamentaux de cette approche.&lt;/em&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;em&gt;Je vous souhaite une bonne lecture de cet article et de Programmez.&lt;/em&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;em&gt;--Philippe&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;_____________________________________________________________________________&lt;/em&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Parmi les nouveaut&amp;eacute;s qu&amp;rsquo;apporte &amp;laquo; Big Data &amp;raquo;, il y a une inversion de contr&amp;ocirc;le si on peut dire, &amp;agrave; savoir que l&amp;rsquo;utilisateur ne fait pas que chercher ; la machine lui propose des donn&amp;eacute;es &amp;eacute;galement.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/2313.image_5F00_510A7BD2.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/7043.image_5F00_thumb_5F00_6AFE3BF4.png" alt="image" width="454" height="215" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Pour faire cela, la machine apprend en fonction des donn&amp;eacute;es qu&amp;rsquo;elle a d&amp;eacute;j&amp;agrave; en sa possession avant d&amp;rsquo;utiliser ce qu&amp;rsquo;elle a appris pour extrapoler et restituer par exemple des recommandations. Cela est un des types d&amp;rsquo;algorithmes classiques de type &amp;laquo; Machine Learning &amp;raquo;. Quand on parle ici de la machine dans le domaine des &amp;laquo; Big Data &amp;raquo;, il s&amp;rsquo;agit en fait d&amp;rsquo;un cluster de machines. Il peut y en avoir des centaines, voire des milliers.&lt;/p&gt;
&lt;p align="justify"&gt;Mahout fait partie de l&amp;rsquo;&amp;eacute;cosyst&amp;egrave;me Hadoop. C&amp;rsquo;est la traduction de Cornac qui est un conducteur d&amp;rsquo;&amp;eacute;l&amp;eacute;phant, l&amp;rsquo;&amp;eacute;l&amp;eacute;phant &amp;eacute;tant le symbole de Hadoop. Mahout regroupe des algorithmes de type &amp;laquo; Machine Learning &amp;raquo; et ils ont la caract&amp;eacute;ristique de pouvoir fonctionner de fa&amp;ccedil;on distribu&amp;eacute;e, typiquement sur des jeux de donn&amp;eacute;es qui ne tiennent pas sur une seule machine.&lt;/p&gt;
&lt;p align="justify"&gt;Mahout ne fait pas que recommander. Il existe aussi des algorithmes de classification, et de regroupement (&amp;laquo; clustering &amp;raquo;), qui avec les recommandations ou filtrage collectif repr&amp;eacute;sentent les principales cat&amp;eacute;gories. La classification est souvent illustr&amp;eacute;e par l&amp;rsquo;exemple des newsgroups. Apr&amp;egrave;s avoir appris sur un certain nombre d&amp;rsquo;articles class&amp;eacute;s dans des groupes, la machine peut proposer un groupe ou classer un texte qu&amp;rsquo;elle n&amp;rsquo;avait pas encore rencontr&amp;eacute;. Le regroupement quant &amp;agrave; lui consiste &amp;agrave; passer d&amp;rsquo;un grand nombre de donn&amp;eacute;es &amp;agrave; un petit nombre de groupes de donn&amp;eacute;es similaires, ce qui rend le tout humainement manipulable.&lt;/p&gt;
&lt;p align="justify"&gt;Mais revenons &amp;agrave; la recommandation, et voyons comment tester cela concr&amp;egrave;tement, avec comme exemple des recommandations de chansons. L&amp;rsquo;id&amp;eacute;e est que plus une personne a &amp;eacute;cout&amp;eacute; un morceau de musique plus elle l&amp;rsquo;aime. En fonction du comportement d&amp;rsquo;un grand nombre de personnes, on peut recommander &amp;agrave; quelqu&amp;rsquo;un qui aime un certain nombre de morceaux les chansons qu&amp;rsquo;il risque d&amp;rsquo;aimer aussi, et qu&amp;rsquo;il n&amp;rsquo;a pas encore &amp;eacute;cout&amp;eacute;es. Pour que ce genre d&amp;rsquo;algorithme fonctionne, il est n&amp;eacute;cessaire de disposer d&amp;rsquo;un jeu de donn&amp;eacute;es r&amp;eacute;el puisqu&amp;rsquo;on parle d&amp;rsquo;intelligence collective. Partir d&amp;rsquo;un jeu de donn&amp;eacute;es g&amp;eacute;n&amp;eacute;r&amp;eacute; al&amp;eacute;atoirement ne donnerait que des r&amp;eacute;sultats al&amp;eacute;atoires et sans int&amp;eacute;r&amp;ecirc;t en sortie. Pour cet exemple, on s&amp;rsquo;appuie sur le jeu de donn&amp;eacute;es appel&amp;eacute; &amp;laquo; Million Song Dataset &amp;raquo; qu&amp;rsquo;on abr&amp;egrave;ge en MSD. Ce jeu de donn&amp;eacute;es comporte un peu plus d&amp;rsquo;un million d&amp;rsquo;utilisateurs, un peu moins de quatre cent mille chansons, et presque cinquante millions de triplets (utilisateur, chanson, nombre d&amp;rsquo;&amp;eacute;coutes). Ces informations et d&amp;rsquo;autres sont disponibles sur le &lt;a href="http://labrosa.ee.columbia.edu/millionsong/tasteprofile#numbers"&gt;site de l&amp;rsquo;universit&amp;eacute; de Columbia&lt;/a&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;Le job de recommandations de Mahout qu&amp;rsquo;on va utiliser ne prend que des entiers en entr&amp;eacute;e, alors que le MSD identifie les utilisateurs et les chansons par des identifiants. Il est donc n&amp;eacute;cessaire de faire une transformation pour passer de ce type de jeu de donn&amp;eacute;es :&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;b80344d063b5ccb3212f76538f3d9e43d87dca9eSOYHEPA12A8C13097F&lt;span style="mso-tab-count: 1;"&gt;&amp;nbsp; &lt;/span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;b80344d063b5ccb3212f76538f3d9e43d87dca9eSOYYWMD12A58A7BCC9&lt;span style="mso-tab-count: 1;"&gt;&amp;nbsp; &lt;/span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;b80344d063b5ccb3212f76538f3d9e43d87dca9eSOZGCUB12A8C133997&lt;span style="mso-tab-count: 1;"&gt;&amp;nbsp; &lt;/span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;b80344d063b5ccb3212f76538f3d9e43d87dca9eSOZOBWN12A8C130999&lt;span style="mso-tab-count: 1;"&gt;&amp;nbsp; &lt;/span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;b80344d063b5ccb3212f76538f3d9e43d87dca9eSOZZHXI12A8C13BF7D&lt;span style="mso-tab-count: 1;"&gt;&amp;nbsp; &lt;/span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;85c1f87fea955d09b4bec2e36aee110927aedf9aSOACWYB12AF729E581&lt;span style="mso-tab-count: 1;"&gt;&amp;nbsp; &lt;/span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;85c1f87fea955d09b4bec2e36aee110927aedf9aSOAUSXX12A8C136188&lt;span style="mso-tab-count: 1;"&gt;&amp;nbsp; &lt;/span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;85c1f87fea955d09b4bec2e36aee110927aedf9aSOBVAHM12A8C13C4CB&lt;span style="mso-tab-count: 1;"&gt;&amp;nbsp; &lt;/span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;85c1f87fea955d09b4bec2e36aee110927aedf9aSODJTHN12AF72A8FCD&lt;span style="mso-tab-count: 1;"&gt;&amp;nbsp; &lt;/span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;85c1f87fea955d09b4bec2e36aee110927aedf9aSOELXOV12A8C13616B&lt;span style="mso-tab-count: 1;"&gt;&amp;nbsp; &lt;/span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;85c1f87fea955d09b4bec2e36aee110927aedf9aSOGGLLR12A8C13C471&lt;span style="mso-tab-count: 1;"&gt;&amp;nbsp; &lt;/span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;A ce type de jeu de donn&amp;eacute;es :&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;1,100,8&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;1,101,1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;1,102,1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;1,103,1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;1,104,1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;2,105,2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;2,106,1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;2,107,1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;2,108,2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;2,109,2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;2,110,2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;C&amp;rsquo;est le jeu de donn&amp;eacute;es d&amp;rsquo;apprentissage.&lt;/p&gt;
&lt;p align="justify"&gt;On conserve par ailleurs (par exemple dans un table non relationnelle du stockage Windows Azure) les correspondances. Les correspondances pour les utilisateurs sont utiles uniquement lors de la cr&amp;eacute;ation du fichier pour retrouver un utilisateur. En effet, ils sont anonymis&amp;eacute;s et 85c1f87fea955d09b4bec2e36aee110927aedf9a ne signifie pas grand-chose de plus que 2 par exemple. En revanche, conserver les correspondances entre les chansons et les morceaux de musique a un int&amp;eacute;r&amp;ecirc;t car cela permet de faire appel &amp;agrave; des API qui connaissent SOZZHXI12A8C13BF7D et pas 104. On trouvera &amp;agrave; &lt;a href="http://morceau.azurewebsites.net"&gt;http://morceau.azurewebsites.net&lt;/a&gt; un site qui permet &amp;agrave; partir du num&amp;eacute;ro (ex : 104) de retrouver les informations sur le morceau quand ses derni&amp;egrave;res sont disponibles. Cela s&amp;rsquo;appuie sur l&amp;rsquo;API disponible &amp;agrave; &lt;a href="http://developer.echonest.com"&gt;http://developer.echonest.com&lt;/a&gt;. Le site echonest.com ne recense qu&amp;rsquo;une partie des morceaux du MSD ; c&amp;rsquo;est pourquoi on peut ne pas obtenir de renseignements &amp;agrave; partir d&amp;rsquo;un identifiant MSD de chanson.&lt;/p&gt;
&lt;p align="justify"&gt;En entr&amp;eacute;e de l&amp;rsquo;algorithme, on aura besoin &amp;eacute;galement d&amp;rsquo;un fichier users.txt qui donne la liste des num&amp;eacute;ros d&amp;rsquo;utilisateurs pour lesquels on veut des recommandations. Par exemple, si on veut des recommandations pour les utilisateurs 1, 5 et 6, le fichier users.txt contient :&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Maintenant qu&amp;rsquo;on dispose du jeu de donn&amp;eacute;es voyons comment on peut ex&amp;eacute;cuter l&amp;rsquo;algorithme.&lt;/p&gt;
&lt;p align="justify"&gt;On utilisera HDInsight Service, qui est une distribution d&amp;rsquo;Hadoop sur Windows Azure. Un de ses avantages est qu&amp;rsquo;on n&amp;rsquo;a pas besoin d&amp;rsquo;installer le cluster Hadoop, il est disponible &amp;agrave; la demande. Pour savoir comment vous procurer un compte (gratuit ou premium), nous en parlons dans ce &lt;a href="http://blogs.msdn.com/b/big_data_france/archive/2013/03/26/bienvenue-dans-la-version-pr-233-liminaire-de-windows-azure-hdinsight.aspx"&gt;billet&lt;/a&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;NB : Il est aussi possible d&amp;rsquo;installer une version mono serveur depuis le Web Platform Installer de Windows et en cherchant &amp;laquo; Hadoop &amp;raquo;. La d&amp;eacute;marche est d&amp;eacute;crite &lt;a href="http://blogs.msdn.com/b/big_data_france/archive/2012/12/05/installation-d-hdinsight-server-hadoop-sur-une-machine-windows.aspx"&gt;ici&lt;/a&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;Une fois le cluster HDInisght Service cr&amp;eacute;&amp;eacute;, il est possible de se connecter sur le n&amp;oelig;ud principal du cluster avec le bureau &amp;agrave; distance (&amp;laquo; remote desktop &amp;raquo;). Il faut copier le jeu de donn&amp;eacute;es sur HDFS ou un autre syst&amp;egrave;me de fichiers compatible tel qu&amp;rsquo;ASV (Azure Storage Vault, autrement dit les blobs Windows Azure). Ici, on s&amp;rsquo;appuie sur HDFS. Si les donn&amp;eacute;es sont assez petites, par exemple si les donn&amp;eacute;es d&amp;rsquo;apprentissage tiennent dans un fichier mInput.txt, on peut alors copier les fichiers sur C:\ sur le n&amp;oelig;ud principal du cluster puis les envoyer sur HDFS de la fa&amp;ccedil;on suivante. Ouvrir l&amp;rsquo;invite de commande qui est sur le bureau &lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/4747.clip_5F00_image001_5F00_7476FA6A.png"&gt;&lt;img style="border: 0px currentcolor; display: inline; background-image: none;" title="clip_image001" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/3386.clip_5F00_image001_5F00_thumb_5F00_134D6E49.png" alt="clip_image001" width="87" height="84" border="0" /&gt;&lt;/a&gt; et entrer les commandes suivantes :&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas; mso-ansi-language: en-us;" lang="EN-US"&gt;&lt;span style="font-size: 9pt;"&gt;Hadoop fs &amp;ndash;mkdir /hwork&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas; mso-ansi-language: en-us;" lang="EN-US"&gt;&lt;span style="font-size: 9pt;"&gt;Hadoop fs &amp;ndash;mkdir /hwork/input1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas; mso-ansi-language: en-us;" lang="EN-US"&gt;&lt;span style="font-size: 9pt;"&gt;Hadoop fs &amp;ndash;mkdir /hwork/input2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas; mso-ansi-language: en-us;" lang="EN-US"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas; mso-ansi-language: en-us;" lang="EN-US"&gt;&lt;span style="font-size: 9pt;"&gt;hadoop fs -copyFromLocal c:\mInput.txt /hwork/input1/mInput.txt&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas; mso-ansi-language: en-us;" lang="EN-US"&gt;&lt;span style="font-size: 9pt;"&gt;hadoop fs -copyFromLocal c:\users.txt /hwork/input2/users.txt&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Dans le cas o&amp;ugrave; on utilise l&amp;rsquo;int&amp;eacute;gralit&amp;eacute; des donn&amp;eacute;es du MSD, il est plus r&amp;eacute;aliste de d&amp;eacute;couper les donn&amp;eacute;es d&amp;rsquo;apprentissage par exemple en fichiers d&amp;rsquo;un million d&amp;rsquo;enregistrements chacun, de les compresser avec un algorithme tel que BIZP2, et de les mettre dans un r&amp;eacute;pertoire. La d&amp;eacute;compression, et la lecture de tous les fichiers est prise en compte automatiquement par Hadoop ; on pr&amp;eacute;cise uniquement /hwork/input1/ comme source de donn&amp;eacute;es. Dans la copie d&amp;rsquo;&amp;eacute;cran suivante, on montre les donn&amp;eacute;es d&amp;rsquo;apprentissage compl&amp;egrave;tes :&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/5873.image_5F00_52AB21D9.png"&gt;&lt;img style="border: 0px currentcolor; display: inline; background-image: none;" title="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/1184.image_5F00_thumb_5F00_3F89F52D.png" alt="image" width="558" height="128" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(&amp;hellip;)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/4670.image_5F00_456498C6.png"&gt;&lt;img style="border: 0px currentcolor; display: inline; background-image: none;" title="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/2047.image_5F00_thumb_5F00_08606734.png" alt="image" width="554" height="145" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Il suffit ensuite de lancer la commande suivante :&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;hadoop jar c:\apps\dist\mahout-0.5\mahout-core-0.5-job.jar org.apache.mahout.cf.taste.hadoop.item.RecommenderJob --input=/hwork/input1/ --output=/work/output --usersFile=/hwork/input2/users.txt&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Cela d&amp;eacute;clenche un batch qui peut durer plusieurs dizaines de minutes, voire plusieurs heures. En sortie, on a un fichier comprenant les recommandations pour les utilisateurs demand&amp;eacute;s :&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="line-height: 9pt; mso-bidi-font-family: consolas; mso-bidi-font-size: 11.0pt;"&gt;&lt;span style="font-size: 8pt;"&gt;1&lt;span style="mso-tab-count: 1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[95:4.7,101:4.375,94:4.375,87:4.375,81:4.2,15:4.2,82:4.2,77:4.2,19:4.2,98:4.111111]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="line-height: 9pt; mso-bidi-font-family: consolas; mso-bidi-font-size: 11.0pt;"&gt;&lt;span style="font-size: 8pt;"&gt;5&lt;span style="mso-tab-count: 1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[2639:6.0,167:5.6923075,169:5.6923075,182:5.6923075,180:5.6923075,179:5.6923075,178:5.6923075,181:5.6923075,174:5.6923075,172:5.6923075]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="line-height: 9pt; mso-bidi-font-family: consolas; mso-bidi-font-size: 11.0pt;"&gt;&lt;span style="font-size: 8pt;"&gt;6&lt;span style="mso-tab-count: 1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[13:10.5,1719:10.5,1726:10.5,1736:9.666667,1482:9.666667,1731:9.666667,1738:9.666667,1242:9.5,1277:9.5,1247:9.5]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Cela se lit de la fa&amp;ccedil;on suivante :&lt;/p&gt;
&lt;p align="justify"&gt;On recommande &amp;agrave; l&amp;rsquo;utilisateur 1 la chanson 95, avec un indice de 4,7, la chanson 101 avec un indice de 4,375, &amp;hellip;, &amp;agrave; l&amp;rsquo;utilisateur 6 la chanson 1247 avec un indice de 9.5. Plus l&amp;rsquo;indice est &amp;eacute;lev&amp;eacute;, plus la recommandation est forte.&lt;/p&gt;
&lt;p align="justify"&gt;Le d&amp;eacute;tail du mode op&amp;eacute;ratoire sur un sous ensemble des donn&amp;eacute;es est document&amp;eacute; en anglais &amp;agrave; &lt;a href="http://www.windowsazure.com/en-us/develop/net/tutorials/hadoop-recommendation-engine/"&gt;http://www.windowsazure.com/en-us/develop/net/tutorials/hadoop-recommendation-engine/&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Voyons maintenant la pertinence de ce qui est propos&amp;eacute; par l&amp;rsquo;algorithme. Pour cela, on s&amp;rsquo;appuie sur l&amp;rsquo;exemple de l&amp;rsquo;utilisateur 35. Si l&amp;rsquo;on entre la liste de ce qu&amp;rsquo;il a &amp;eacute;cout&amp;eacute; &amp;agrave; &lt;a href="http://morceau.azurewebsites.net/"&gt;http://morceau.azurewebsites.net&lt;/a&gt;, &amp;agrave; savoir :&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 206 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 509 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 214 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1768 1935 1936 1937 1938 1939 1940 1941 532 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1482 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;On obtient une liste avec la possibilit&amp;eacute; d&amp;rsquo;&amp;eacute;couter des &amp;eacute;chantillons d&amp;rsquo;une partie des morceaux. On voit qu&amp;rsquo;il y a une bonne proportion de morceaux de l&amp;rsquo;artiste Sade.&lt;/p&gt;
&lt;p align="justify"&gt;Les recommandations sur un jeu d&amp;rsquo;apprentissage moyen sont :&lt;/p&gt;
&lt;p class="code" style="margin: 3pt 0in 0pt; line-height: 10pt; list-style-type: disc;"&gt;&lt;span style="mso-bidi-font-family: consolas; mso-ansi-language: en-us;" lang="EN-US"&gt;&lt;span style="font-size: 9pt;"&gt;35&lt;span style="mso-tab-count: 1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[8192:53.5,1825:53.5,1748:53.2,411:46.833332,1950:43.333332,335:42.75,1893:42.5,1880:42.333332,3511:40.090908,1979:39.333332]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Le morceau 1950 (SOVBAPB12A8AE48D82) est &amp;ldquo;Your Love Is King&amp;rdquo; de Sade.&lt;/p&gt;
&lt;p align="justify"&gt;Pour se faire une id&amp;eacute;e intuitive plus compl&amp;egrave;te de ce que cela donne, il est pr&amp;eacute;f&amp;eacute;rable d&amp;rsquo;&amp;eacute;couter des extraits de ce qui a &amp;eacute;t&amp;eacute; choisi et de ce qui est propos&amp;eacute;. Pour cela, les donn&amp;eacute;es des premiers utilisateurs (&amp;eacute;coute et recommandations) sont disponibles sur le site &lt;a href="http://morceau.azurewebsites.net"&gt;http://morceau.azurewebsites.net&lt;/a&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/0317.image_5F00_4E04F152.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/8032.image_5F00_thumb_5F00_0A6D4030.png" alt="image" width="473" height="366" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Les r&amp;eacute;sultats d&amp;rsquo;ex&amp;eacute;cution se trouvent dans l&amp;rsquo;archive &lt;strong&gt;test.zip&lt;/strong&gt;, vous trouverez les logs d&amp;rsquo;Hadoop dans le fichier &lt;strong&gt;r&amp;eacute;sultat-ex&amp;eacute;cution.txt&lt;/strong&gt; ainsi que les donn&amp;eacute;es d&amp;rsquo;entr&amp;eacute;e et de sortie dans le dossier &lt;strong&gt;mahout&lt;/strong&gt;. De plus, un exemple de jeu de donn&amp;eacute;es est fourni &amp;agrave; l&amp;rsquo;int&amp;eacute;rieur de l&amp;rsquo;archive &lt;strong&gt;SampleData.zip&lt;/strong&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;Toute ces archives sont propos&amp;eacute;es dans l&amp;rsquo;archive &lt;strong&gt;Mahout.zip&lt;/strong&gt; disponible en pi&amp;egrave;ce jointe ci-dessous.&lt;/p&gt;
&lt;p align="justify"&gt;Bon test !&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10418927" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-10-41-89-27/Mahout.zip" length="8111179" type="application/octet-stream" /><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Big+Data/">Big Data</category><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Mahout/">Mahout</category><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Machine+Learning/">Machine Learning</category></item><item><title>StreamInsight et le modèle de conception Observateur</title><link>http://blogs.msdn.com/b/big_data_france/archive/2013/05/15/streaminsight-et-le-mod-232-le-de-conception-observateur.aspx</link><pubDate>Wed, 15 May 2013 13:23:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10418906</guid><dc:creator>Philippe Beraud - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/big_data_france/rsscomments.aspx?WeblogPostID=10418906</wfw:commentRss><comments>http://blogs.msdn.com/b/big_data_france/archive/2013/05/15/streaminsight-et-le-mod-232-le-de-conception-observateur.aspx#comments</comments><description>&lt;p align="justify"&gt;Depuis l&amp;rsquo;&lt;a href="http://blogs.msdn.com/b/big_data_france/archive/2012/11/30/exploitez-le-171-d-233-luge-des-donn-233-es-187.aspx"&gt;ouverture de ce blog&lt;/a&gt;, nous avons au travers d&amp;rsquo;un certain nombre de billets quelque peu &amp;laquo; d&amp;eacute;broussaill&amp;eacute; &amp;raquo; l&amp;rsquo;&amp;eacute;cosyst&amp;egrave;me Hadoop et tous les projets et outils qui gravitent autour, ainsi que les usages qui peuvent en &amp;ecirc;tre fait autour des domaines Volume et Vari&amp;eacute;t&amp;eacute; tels que caract&amp;eacute;ris&amp;eacute;s par le principe des 3V (Volume, Vitesse, Vari&amp;eacute;t&amp;eacute;) du Gartner de plus en plus d&amp;eacute;mocratis&amp;eacute;. (Ces 3 domaines cl&amp;eacute;s permettent de d&amp;eacute;finir ce que sont les Big Data et vous serez amen&amp;eacute;s tr&amp;egrave;s probablement &amp;agrave; faire face &amp;agrave; chacun des Vs &amp;agrave; un degr&amp;eacute; ou un autre si ce n&amp;rsquo;est d&amp;rsquo;ores et d&amp;eacute;j&amp;agrave; le cas.)&lt;/p&gt;
&lt;p align="justify"&gt;Dans le cas pr&amp;eacute;sent, on parle de l&amp;rsquo;&amp;eacute;cosyst&amp;egrave;me Hadoop pour l&amp;rsquo;analyse sur des donn&amp;eacute;es aussi bien structur&amp;eacute;es que non-structur&amp;eacute;es. Mais ici, le terme &amp;laquo; non-structur&amp;eacute; &amp;raquo; d&amp;eacute;signe une donn&amp;eacute;e sans relation/contexte. Typiquement, une base de donn&amp;eacute;es relationnelle (Microsoft SQL Server par exemple) d&amp;eacute;crit une forte int&amp;eacute;grit&amp;eacute; aux donn&amp;eacute;es qu&amp;rsquo;elle contient par le biais de relations. Cependant, la non-structure de la donn&amp;eacute;e ne veut pas dire que la donn&amp;eacute;e soit d&amp;eacute;sorganis&amp;eacute;e. Au contraire, avec l&amp;rsquo;exp&amp;eacute;rience, on se rend compte qu&amp;rsquo;il nous faudra organiser la donn&amp;eacute;e avant de proc&amp;eacute;der &amp;agrave; tout &lt;a href="http://blogs.msdn.com/b/big_data_france/archive/2013/03/25/vous-avez-dit-hadoop-1-232-re-partie.aspx"&gt;traitement Map/Reduce&lt;/a&gt;. Dans le cas oppos&amp;eacute;, l&amp;rsquo;automatisation du processus de traitement Map/Reduce sera difficile.&lt;/p&gt;
&lt;p align="justify"&gt;Beaucoup de demandes sont exprim&amp;eacute;es aujourd&amp;rsquo;hui vis-&amp;agrave;-vis de ce type d&amp;rsquo;usage envisag&amp;eacute; ici, demandes qui permettent notamment au d&amp;eacute;cisionnel de prendre la vague des Big Data comme illustr&amp;eacute; &lt;a href="http://blogs.msdn.com/b/big_data_france/archive/2013/01/31/big-data-amp-bi-social-travel-analysis-1-232-re-partie.aspx"&gt;ici&lt;/a&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;Mais une fois la d&amp;eacute;cision prise d&amp;rsquo;investir dans cette direction, plusieurs questions se posent comme typiquement :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Est-ce que mes donn&amp;eacute;es sont suffisantes ?&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Si non, comment se constitue-t-on un jeu de donn&amp;eacute;es suffisant ?&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Comment doit-on les organiser ?&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Constitution d&amp;rsquo;un jeu de donn&amp;eacute;es exploitables&lt;/h1&gt;
&lt;p align="justify"&gt;Si, dans ce contexte, nous connaissons les techniques de traitement (Map/Reduce avec Hadoop), une des grandes probl&amp;eacute;matiques r&amp;eacute;sulte dans la possession de donn&amp;eacute;es exploitables.&lt;/p&gt;
&lt;p align="justify"&gt;Pour r&amp;eacute;pondre &amp;agrave; cette probl&amp;eacute;matique, nous allons nous appuyer sur la technologie Microsoft StreamInsight. L&amp;rsquo;architecture de StreamInsight est con&amp;ccedil;ue pour absorber et agr&amp;eacute;ger de nombreuses donn&amp;eacute;es, provenant de flux diff&amp;eacute;rents. Son utilit&amp;eacute; premi&amp;egrave;re, vous l&amp;rsquo;aurez donc devin&amp;eacute;, est l&amp;rsquo;analyse en temps r&amp;eacute;el de donn&amp;eacute;es et donc de prendre en consid&amp;eacute;ration les domaines Vitesse et Vari&amp;eacute;t&amp;eacute; du principe des 3V pr&amp;eacute;c&amp;eacute;dent.&lt;/p&gt;
&lt;p align="justify"&gt;Dans ce billet, nous allons en d&amp;eacute;tourner l&amp;rsquo;usage pour en faire un &amp;laquo; d&amp;rsquo;aspirateur de donn&amp;eacute;es &amp;raquo;. Une fois une quantit&amp;eacute; cons&amp;eacute;quente de donn&amp;eacute;es entrepos&amp;eacute;es, nous l&amp;rsquo;analyserons avec les m&amp;eacute;thodes Big Data que propose Hadoop.&lt;/p&gt;
&lt;p align="justify"&gt;StreamInsight va nous permettre de constituer notre jeu de donn&amp;eacute;es exploitable sur lequel nous pourrons ensuite faire nos analyses, et il le fera de fa&amp;ccedil;on automatique, avec un minimum de programmation. Ce cas d&amp;rsquo;usage de StreamInsight diff&amp;egrave;re quelque peu de celui illustr&amp;eacute; dans le cadre des &lt;a href="http://blogs.msdn.com/b/big_data_france/archive/2012/12/05/revivez-l-apr-232-s-midi-du-dev-consacr-233-e-aux-big-data-hadoop-sur-azure-et-consorts.aspx"&gt;apr&amp;egrave;s-midi du dev consacr&amp;eacute;es aux Big Data&lt;/a&gt; : &lt;a href="http://msdn.microsoft.com/fr-fr/jj200257"&gt;Et la v&amp;eacute;locit&amp;eacute;? StreamInsight (avec du code LINQ)&lt;/a&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;Dans un cas d&amp;rsquo;usage r&amp;eacute;el, l&amp;rsquo;approche nous permettrait de placer toutes sortes de capteurs/traceurs &amp;agrave; diff&amp;eacute;rents endroits sur la plateforme de production &amp;agrave; exploiter pour la circonstance, enregistrant les actions des utilisateurs. Dans le cadre du tutoriel que nous vous proposons ici, et en l&amp;rsquo;absence d&amp;rsquo;une telle plateforme, nous allons simplement utiliser une source r&amp;eacute;guli&amp;egrave;rement sollicit&amp;eacute;e dans les tutoriels sur les Big Data, en l&amp;rsquo;occurrence Twitter.&lt;/p&gt;
&lt;p align="justify"&gt;Twitter a l&amp;rsquo;avantage de fournir beaucoup de donn&amp;eacute;es, rapidement, et de fa&amp;ccedil;on gratuite. Il vous reviendra la t&amp;acirc;che d&amp;rsquo;adapter ensuite ce tutoriel &amp;agrave; votre propre utilisation ;)&lt;/p&gt;
&lt;h2&gt;Pr&amp;eacute;sentation de Twitter API&lt;/h2&gt;
&lt;p align="justify"&gt;Twitter API est un groupement d&amp;rsquo;interface fournie aux d&amp;eacute;veloppeurs donnant acc&amp;egrave;s aux tweets h&amp;eacute;berg&amp;eacute;s par le r&amp;eacute;seau social. Si plusieurs possibilit&amp;eacute;s existent, celle qui nous int&amp;eacute;resse s&amp;rsquo;appelle la &lt;a href="https://dev.twitter.com/docs/streaming-apis"&gt;Streaming API&lt;/a&gt;. L&amp;rsquo;id&amp;eacute;e derri&amp;egrave;re cette fonction offerte par Twitter de fa&amp;ccedil;on publique est de donner acc&amp;egrave;s au flux global Twitter sans passer par une boucle envoyant une nouvelle requ&amp;ecirc;te HTTP &amp;agrave; Twitter.&lt;/p&gt;
&lt;p align="justify"&gt;Cette interface diff&amp;egrave;re de l&amp;rsquo;API REST par le fait qu&amp;rsquo;elle demande une connexion HTTP constamment ouverte. On &amp;eacute;vite ainsi un renvoie de l&amp;rsquo;ent&amp;ecirc;te HTTP qui consomme de la bande passante. On se repr&amp;eacute;sente le flux comme une requ&amp;ecirc;te infinie.&lt;/p&gt;
&lt;p align="justify"&gt;Twitter propose plusieurs points de terminaison, correspondant &amp;agrave; des cas d&amp;rsquo;utilisations diff&amp;eacute;rents :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;strong&gt;Public streams&lt;/strong&gt; : le flux de donn&amp;eacute;es publiques, c&amp;rsquo;est-&amp;agrave;-dire l&amp;rsquo;arriv&amp;eacute;e en continu des Tweets de comptes publiques.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;strong&gt;User streams&lt;/strong&gt; : le flux de Tweets d&amp;rsquo;un utilisateur en particulier.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;strong&gt;Site streams&lt;/strong&gt; : une version multi-utilisateurs du point de terminaison User streams.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;Nous utiliserons le premier, &lt;strong&gt;Public streams&lt;/strong&gt;. En ouvrant &lt;a href="https://stream.twitter.com/1.1/statuses/sample.json"&gt;ce lien&lt;/a&gt; propos&amp;eacute; par Twitter depuis un browser, vous pouvez apercevoir un texte qui d&amp;eacute;file au fur-et-&amp;agrave;-mesure, ne s&amp;rsquo;arr&amp;ecirc;tant jamais. Une ligne &amp;eacute;quivaut &amp;agrave; un nouveau tweet au format JSON (JavaScript Object Notation).&lt;/p&gt;
&lt;p align="justify"&gt;La structure JSON d&amp;rsquo;un tweet est d&amp;eacute;crite dans la documentation Twitter &lt;a href="https://dev.twitter.com/docs/platform-objects/tweets"&gt;ici&lt;/a&gt;. Pour notre cas de test, nous ne garderons que certains attributs du tweet :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;user.screen_name : le nom d&amp;rsquo;utilisateur postant le tweet.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;id_str : l&amp;rsquo;id du tweet.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;created_at : la date de cr&amp;eacute;ation.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;text : le contenu du tweet.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;lang : la langue de l&amp;rsquo;utilisateur.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Concepts de base de StreamInsight&lt;/h2&gt;
&lt;p align="justify"&gt;StreamInsight est une plate-forme permettant de traiter des &amp;eacute;v&amp;eacute;nements complexes et d&amp;rsquo;analyser leurs r&amp;eacute;sultats en temps r&amp;eacute;els. On parle en anglais de &lt;a href="http://fr.wikipedia.org/wiki/Complex_event_processing"&gt;Complex Event Processing (CEP)&lt;/a&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;CEP est une m&amp;eacute;thode dite &amp;laquo; in-memory &amp;raquo; pour l&amp;rsquo;analyse de flux de donn&amp;eacute;es en continu, ceux-ci provenant de sources multiples, bas&amp;eacute; sur un langage de requ&amp;ecirc;te d&amp;eacute;claratif - LINQ (.NET Language-Integrated Query) en l&amp;rsquo;occurrence avec .NET &amp;ndash; avec une latence faible sur un grand nombre d&amp;rsquo;&amp;eacute;v&amp;egrave;nements.&lt;/p&gt;
&lt;p align="justify"&gt;Si vous vous demandez quels sont les cas d&amp;rsquo;usage, imaginez que nous recevions les donn&amp;eacute;es de g&amp;eacute;olocalisations de milliers de t&amp;eacute;l&amp;eacute;phones et ce, toutes les secondes. Si vous d&amp;eacute;veloppez un service qui r&amp;eacute;ceptionne sur un serveur ces informations de g&amp;eacute;olocalisation, ce dernier sera tr&amp;egrave;s vite satur&amp;eacute; car il n&amp;rsquo;est pas adapt&amp;eacute; &amp;agrave; un nombre de requ&amp;ecirc;tes aussi important, &amp;agrave; traiter aussi rapidement. On est bien dans le domaine Vitesse. La plateforme StreamInsight ne le sera pas. Dans sa version standard, celle-ci est capable de recevoir 10 000 &amp;eacute;v&amp;egrave;nements &amp;agrave; la seconde !&lt;/p&gt;
&lt;p align="justify"&gt;Concr&amp;egrave;tement,&amp;nbsp; une biblioth&amp;egrave;que de classes .NET est mise &amp;agrave; notre disposition pour analyser (agr&amp;eacute;ger et corr&amp;eacute;ler) en temps r&amp;eacute;el les donn&amp;eacute;es qui arrivent en continu dans un flux. Pour revenir &amp;agrave; notre aspirateur, objet de ce tutoriel, celui-ci doit sur cette base adapter ensuite une sortie pour un ou plusieurs programmes, et ce &amp;agrave; des fins de stockage.&lt;/p&gt;
&lt;p align="justify"&gt;En termes de mise en &amp;oelig;uvre, cela suppose typiquement de s&amp;rsquo;appuyer sur les &amp;eacute;l&amp;eacute;ments suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;strong&gt;Adaptateur en entr&amp;eacute;e (Input Adapter)&lt;/strong&gt; : un objet de ce type expose une interface pour collecter les donn&amp;eacute;es issues de sources diff&amp;eacute;rentes (bases de donn&amp;eacute;es, services Web, capteurs, flux r&amp;eacute;seaux sociaux, etc.).&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;strong&gt;Requ&amp;ecirc;tes LINQ&lt;/strong&gt; : elles agissent comme des filtres permettant de r&amp;eacute;cup&amp;eacute;rer et d&amp;rsquo;agr&amp;eacute;ger les donn&amp;eacute;es souhait&amp;eacute;es. Elles se situent g&amp;eacute;n&amp;eacute;ralement dans la m&amp;eacute;thode principale d&amp;rsquo;une application.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;strong&gt;Adaptateur en sortie (Output Adapter) &lt;/strong&gt;: un objet de ce type sert &amp;agrave; adapter les donn&amp;eacute;es ainsi s&amp;eacute;lectionn&amp;eacute;es aux utilisations que nous souhaitons en faire : les stocker par exemple dans Windows Azure en vue d&amp;rsquo;un traitement ult&amp;eacute;rieur.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;Vous trouverez sur la forge &lt;a href="http://www.codeplex.com/"&gt;CodePlex&lt;/a&gt; un &lt;a href="http://twitterbigdata.codeplex.com/"&gt;exemple d&amp;rsquo;application StreamInsight&lt;/a&gt; d&amp;ucirc;ment document&amp;eacute;. Ce dernier met en sc&amp;egrave;ne une analyse de sentiments sur Twitter via une analyse des tweets en temps r&amp;eacute;el et une visualisation de leurs tendances.&lt;/p&gt;
&lt;p align="justify"&gt;Comme vous pourrez le constater, le concept est tr&amp;egrave;s puissant, mais il impose une relative complexit&amp;eacute; : il est en effet n&amp;eacute;cessaire de construire pour un adaptateur une classe Factory associ&amp;eacute;e.&lt;/p&gt;
&lt;p align="justify"&gt;A partir de la version 1.1 de StreamInsight, l&amp;rsquo;&amp;eacute;quipe en charge du projet StreamInsight au sein du groupe produit SQL Server propose en parall&amp;egrave;le une nouvelle fa&amp;ccedil;on d&amp;rsquo;aborder les choses, plus simple, &amp;agrave; savoir l&amp;rsquo;utilisation du pattern (mod&amp;egrave;le de conception) Observateur (observer), bien connu dans la programmation orient&amp;eacute;e objet. (L&amp;rsquo;approche initiale succinctement d&amp;eacute;crite ci-avant reste toujours prise en charge.)&lt;/p&gt;
&lt;h2&gt;Mod&amp;egrave;le de conception Observateur&lt;/h2&gt;
&lt;p align="justify"&gt;Ce mod&amp;egrave;le de conception fait partie des principaux &amp;eacute;nonc&amp;eacute;s dans l&amp;rsquo;ouvrage &lt;a href="http://www.amazon.fr/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612"&gt;Design Patterns : Elements of Reusable Object-Oriented Software&lt;/a&gt; - l&amp;rsquo;un des ouvrage de r&amp;eacute;f&amp;eacute;rence sur les patrons de conceptions. Il s&amp;rsquo;av&amp;egrave;re particuli&amp;egrave;rement utile dans une application lorsque l&amp;rsquo;on a besoin d&amp;rsquo;ajouter un couplage entre deux objets lors de l&amp;rsquo;ex&amp;eacute;cution (at runtime). Il agit donc sur le comportement d&amp;rsquo;un objet, c&amp;rsquo;est ce que l&amp;rsquo;on appelle un patron de conception de type comportemental.&lt;/p&gt;
&lt;p align="justify"&gt;Ainsi un objet nomm&amp;eacute; &lt;strong&gt;observable&lt;/strong&gt; est simplement observ&amp;eacute; par d&amp;rsquo;autres objets appel&amp;eacute;s &lt;strong&gt;observateurs&lt;/strong&gt;. Pour prendre un exemple, on l&amp;rsquo;utilise fr&amp;eacute;quemment pour faire de la programmation &amp;eacute;v&amp;egrave;nementielle, afin de s&amp;eacute;parer l&amp;rsquo;affichage du comportement qui est li&amp;eacute; &amp;agrave; celle-ci (si on clique sur le bouton Valider, un objet est notifi&amp;eacute; et se charge de l&amp;rsquo;enregistrement du formulaire).&lt;/p&gt;
&lt;p align="justify"&gt;On &amp;eacute;vite gr&amp;acirc;ce &amp;agrave; ce proc&amp;eacute;d&amp;eacute; de passer par une attente active sur l&amp;rsquo;objet produisant l&amp;rsquo;&amp;eacute;v&amp;egrave;nement (ce qui se traduit par une boucle infinie testant &amp;agrave; chaque tour si l&amp;rsquo;interface a chang&amp;eacute;e). De plus, cela permet &amp;agrave; l&amp;rsquo;objet observ&amp;eacute; de ne pas connaitre &amp;agrave; l&amp;rsquo;avance ses observateurs (=suppression de d&amp;eacute;pendances).&lt;/p&gt;
&lt;p align="justify"&gt;Le sch&amp;eacute;ma ci-dessous explique le d&amp;eacute;roulement :&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/2313.image_5F00_4477B23B.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/7065.image_5F00_thumb_5F00_022499F8.png" alt="image" width="437" height="275" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;L&amp;rsquo;&lt;strong&gt;observable&lt;/strong&gt;, en r&amp;eacute;alit&amp;eacute;, poss&amp;egrave;de une &lt;strong&gt;liste des&lt;/strong&gt; &lt;strong&gt;observateurs&lt;/strong&gt; qui se sont abonn&amp;eacute;s &amp;agrave; lui. Ces observateurs impl&amp;eacute;mentent tous une interface sp&amp;eacute;cifique, &lt;strong&gt;IObserver&lt;/strong&gt;, qui d&amp;eacute;finit une fonction pr&amp;eacute;cise &amp;agrave; appeler lorsqu&amp;rsquo;un nouvel &amp;eacute;v&amp;egrave;nement doit &amp;ecirc;tre diffus&amp;eacute;.&lt;/p&gt;
&lt;p align="justify"&gt;Pour aller plus loin dans la compr&amp;eacute;hension du mod&amp;egrave;le de conception, vous pouvez consulter l&amp;rsquo;article MSDN &lt;a href="http://msdn.microsoft.com/fr-fr/library/ee850490(v=vs.110).aspx"&gt;Mod&amp;egrave;le de design observateur&lt;/a&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;Le Framework. NET apporte sa propre impl&amp;eacute;mentation du mod&amp;egrave;le de conception Observateur depuis la version 4.0, ainsi que, dans le contexte qui nous int&amp;eacute;resse avec StreamInsight, au sein d&amp;rsquo;une biblioth&amp;egrave;que appel&amp;eacute;e &lt;a href="http://msdn.microsoft.com/en-us/data/gg577609.aspx"&gt;Reactive Extensions (Rx)&lt;/a&gt;. (Cette biblioth&amp;egrave;que a &amp;eacute;t&amp;eacute; cr&amp;eacute;&amp;eacute;e de mani&amp;egrave;re ind&amp;eacute;pendante de StreamInsight, mais StreamInsight repose dessus). Vous y trouverez par exemple l&amp;rsquo;interface &lt;strong&gt;IObserver&amp;lt;T&amp;gt;&lt;/strong&gt; ainsi que l&amp;rsquo;interface &lt;strong&gt;IObservable&amp;lt;T&amp;gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;Avec la version 2.1 de StreamInsight, des &lt;a href="http://msdn.microsoft.com/fr-fr/library/vstudio/bb383977.aspx"&gt;m&amp;eacute;thodes d&amp;rsquo;extensions&lt;/a&gt; sont disponibles, elles permettent ni plus ni moins de transformer un objet impl&amp;eacute;mentant l&amp;rsquo;interface IObservable&amp;lt;T&amp;gt; en un flux (&lt;a href="http://msdn.microsoft.com/fr-fr/library/microsoft.complexeventprocessing.linq.cepstream.aspx"&gt;CepStream&lt;/a&gt;, la classe de base d&amp;rsquo;un flux StreamInsight).&lt;/p&gt;
&lt;p align="justify"&gt;A l&amp;rsquo;arriv&amp;eacute;e, l&amp;rsquo;approche autorise un b&amp;eacute;n&amp;eacute;fice non n&amp;eacute;gligeable, &amp;agrave; savoir le fait d&amp;rsquo;&amp;eacute;crire son application sans aucune compr&amp;eacute;hension pr&amp;eacute;alable du concept de CEP, et ce simplement via l&amp;rsquo;utilisation d&amp;rsquo;un mod&amp;egrave;le de conception simple et bien connu.&lt;/p&gt;
&lt;p align="justify"&gt;StreamInsight se charge de &amp;laquo; manager &amp;raquo; votre code et de transformer vos classes en objets Cep (une &lt;a href="http://fr.wikipedia.org/wiki/Inversion_de_controle"&gt;inversion de contr&amp;ocirc;le&lt;/a&gt; est effectu&amp;eacute;e).&lt;/p&gt;
&lt;h1&gt;Conception de notre application AspirateurTwitter exemple&lt;/h1&gt;
&lt;p align="justify"&gt;Apr&amp;egrave;s toutes ces explications, nous pouvons passer &amp;agrave; la mod&amp;eacute;lisation de notre propre exemple application CEP, en utilisant le mod&amp;egrave;le de conception Observateur. Le code de source de l'application est disponible en pi&amp;egrave;ce jointe sous forme de fichier archive .zip en bas de ce billet. N'h&amp;eacute;sitez pas &amp;agrave; le consulter en parall&amp;egrave;le des explications ci-dessous.&lt;/p&gt;
&lt;h2&gt;Un peu d&amp;rsquo;UML&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/6303.image_5F00_0E46141F.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/3073.image_5F00_thumb_5F00_5C8AF6C9.png" alt="image" width="538" height="354" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Voil&amp;agrave; quelques petites pr&amp;eacute;cisions :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Nous d&amp;eacute;finissons une classe Tweet, simple &lt;a href="http://en.wikipedia.org/wiki/Plain_Old_CLR_Object"&gt;POCO&lt;/a&gt; (Plain Old CLR Object). Notre identifiant est un entier base 64, le reste est stock&amp;eacute; dans des chaines de caract&amp;egrave;res. Cette classe surcharge la m&amp;eacute;thode ToString() qui sera utilis&amp;eacute;e pour remplir un blob Azure.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Notre source de donn&amp;eacute;es est d&amp;eacute;crite dans la classe SourceTwitter. Cette classe impl&amp;eacute;mente l&amp;rsquo;interface IObservable&amp;lt;T&amp;gt; qui d&amp;eacute;finit une seule m&amp;eacute;thode : Subscribe(). Elle est appel&amp;eacute;e lorsqu&amp;rsquo;un observateur veut s&amp;rsquo;abonner (=souscrire) &amp;agrave; la source. D&amp;egrave;s lors, on ajoute le nouvel arrivant dans la liste des observateurs. De plus, nous d&amp;eacute;finissons ici une m&amp;eacute;thode interne, notifierObservateurs, qui a pour r&amp;ocirc;le l&amp;rsquo;appel de la m&amp;eacute;thode OnNext() de chaque observateur abonn&amp;eacute;.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Notre observateur du flux Twitter est d&amp;eacute;crit dans la classe ObservateurTwitter, qui impl&amp;eacute;mente l&amp;rsquo;interface IObserver&amp;lt;T&amp;gt;. Il y a une surcharge de la m&amp;eacute;thode OnNext(), prenant un objet Tweet comme param&amp;egrave;tre, de la m&amp;eacute;thode OnError() et OnCompleted(). Cette derni&amp;egrave;re m&amp;eacute;thode est invoqu&amp;eacute;e pour d&amp;eacute;sabonner l&amp;rsquo;observateur de la source.&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Souscription&lt;/h2&gt;
&lt;p align="justify"&gt;Dans notre proposition de mise en &amp;oelig;uvre, la classe &lt;strong&gt;Souscription&lt;/strong&gt; est un peu &amp;agrave; part. Ce qu&amp;rsquo;il faut en savoir est qu&amp;rsquo;elle est n&amp;eacute;cessaire pour d&amp;eacute;sabonner convenablement l&amp;rsquo;observateur de l&amp;rsquo;observable. Lorsqu&amp;rsquo;un objet de type IObserver veut quitter la liste des notifi&amp;eacute;s, il d&amp;eacute;clenche sa m&amp;eacute;thode IObserver.OnCompleted() qui invoque la m&amp;eacute;thode Souscription.Dispose().&lt;/p&gt;
&lt;p align="justify"&gt;Avant cela, une instance de Souscription est retourn&amp;eacute;e par la m&amp;eacute;thode SourceTwitter.Subscribe()&lt;strong&gt; &lt;/strong&gt;au moment o&amp;ugrave; un nouvel observateur veut s&amp;rsquo;abonner. Elle est compos&amp;eacute;e de l&amp;rsquo;observateur et de l&amp;rsquo;observable.&lt;/p&gt;
&lt;p align="justify"&gt;Pourquoi cette classe est-elle n&amp;eacute;cessaire ? Elle d&amp;eacute;couple l&amp;rsquo;observateur de l&amp;rsquo;observable tout simplement. Dans notre application AspirateurTwitter, vous la trouverez comme classe interne &amp;agrave; &lt;strong&gt;SourceTwitter&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Invocation de l&amp;rsquo;API Twitter Streaming&lt;/h2&gt;
&lt;p align="justify"&gt;Notre invocation se situe dans le constructeur de la classe &lt;strong&gt;SourceTwitter&lt;/strong&gt;. Notre exemple est simple et n&amp;rsquo;a pas la pr&amp;eacute;tention d&amp;rsquo;une application de production.&lt;/p&gt;
&lt;p align="justify"&gt;Dans ce constructeur, on peut voir une cr&amp;eacute;ation de t&amp;acirc;che via la biblioth&amp;egrave;que parall&amp;egrave;le de t&amp;acirc;ches &lt;a href="http://msdn.microsoft.com/en-us/library/dd460717.aspx"&gt;TPL (Task Parallel Library)&lt;/a&gt; qui s&amp;rsquo;ex&amp;eacute;cutera donc sur un thread diff&amp;eacute;rent, pour ne pas bloquer le programme. A l&amp;rsquo;int&amp;eacute;rieur, une boucle infinie est faite sur un flux (au travers d&amp;rsquo;un &lt;a href="http://msdn.microsoft.com/fr-fr/library/system.io.streamreader(v=vs.80).aspx"&gt;StreamReader&lt;/a&gt;) provenant d&amp;rsquo;une requ&amp;ecirc;te HTTP (sur Twitter Streaming). Pour chaque it&amp;eacute;ration, on r&amp;eacute;cup&amp;egrave;re la nouvelle ligne dans une chaine de caract&amp;egrave;res, puis on lance la phase de notification de tous les observateurs (gr&amp;acirc;ce &amp;agrave; la m&amp;eacute;thode notifierObservateurs).&lt;/p&gt;
&lt;p align="justify"&gt;Le fichier &lt;strong&gt;App.config&lt;/strong&gt; contient les d&amp;eacute;finitions de deux param&amp;egrave;tres Twitter que vous aurez &amp;agrave; remplacer pour tester le code propos&amp;eacute; pour l&amp;rsquo;illustration :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;twitterAccount : le nom du compte de stockage Windows Azure.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;twitterPass : la clef associ&amp;eacute;e au compte ci-dessus.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;L&amp;rsquo;utilisation de ces param&amp;egrave;tres s&amp;rsquo;appuie sur la classe ConfigurationManager propos&amp;eacute; par le Framework .NET. (Vous pouvez consulter un tutoriel &lt;a href="http://nico-pyright.developpez.com/tutoriel/vc2005/configurationsectioncsharp/"&gt;ici&lt;/a&gt; &amp;agrave; ce sujet pour plus d&amp;rsquo;information).&lt;/p&gt;
&lt;h2&gt;Filtrage avec LINQ&lt;/h2&gt;
&lt;p align="justify"&gt;Dans la classe &lt;strong&gt;Program&lt;/strong&gt;, puis la m&amp;eacute;thode Main(), nous cr&amp;eacute;ons en premier lieu une instance d&amp;rsquo;une nouvelle source &lt;strong&gt;SourceTwitter&lt;/strong&gt;, puis nous la transformons en objet &lt;strong&gt;CepStream&lt;/strong&gt; gr&amp;acirc;ce &amp;agrave; la m&amp;eacute;thode d&amp;rsquo;extension ToPointStream(). Vient ensuite ce qui nous int&amp;eacute;resse, &amp;agrave; savoir le filtre LINQ. Il s&amp;rsquo;agit d&amp;rsquo;une simple requ&amp;ecirc;te LINQ comme on a l&amp;rsquo;habitude d&amp;rsquo;en faire sur le CepStream r&amp;eacute;cup&amp;eacute;r&amp;eacute; pr&amp;eacute;c&amp;eacute;demment :&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; line-height: normal; list-style-type: disc; mso-layout-grid-align: none;"&gt;&lt;span style="line-height: 9pt; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Times New Roman'; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa;" lang="EN-US"&gt;&lt;span style="font-size: 8pt;"&gt;var filtre = from tweet where tweet.Lang == &amp;ldquo;fr&amp;rdquo; in source select tweet;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;Cette simple ligne permet de s&amp;eacute;lectionner les tweets de langue fran&amp;ccedil;aise. A vous de modifier selon votre besoin ;)&lt;/p&gt;
&lt;p align="justify"&gt;Passons &amp;agrave; la suite de la m&amp;eacute;thode Main(), nous transformons cet objet filtre en un objet Observable avec la m&amp;eacute;thode d&amp;rsquo;extension ToPointObservable(). Nous souscrivons notre objet &lt;strong&gt;ObservateurTwitter&lt;/strong&gt; &amp;agrave; cet objet Observable qui le notifiera &amp;agrave; son tour pour chaque nouveau tweet de langue fran&amp;ccedil;aise !&lt;/p&gt;
&lt;p align="justify"&gt;Bien s&amp;ucirc;r il vous est possible d&amp;rsquo;ajouter un deuxi&amp;egrave;me voir m&amp;ecirc;me - soyons fous ;) - un troisi&amp;egrave;me observateur de cette requ&amp;ecirc;te. Il y aurait par exemple un observateur qui se charge de stocker les donn&amp;eacute;es sur un compte de stockage Windows Azure dans le Cloud, un autre alimentant une interface de visualisation sur un site Web, proposant ainsi un affichage temps r&amp;eacute;el d&amp;rsquo;un graphique, etc.&lt;/p&gt;
&lt;h2&gt;Stockage des tweets sur Windows Azure&lt;/h2&gt;
&lt;p align="justify"&gt;Si vous &amp;ecirc;tes attentifs, la classe &lt;strong&gt;ObservateurTwitter&lt;/strong&gt; poss&amp;egrave;de des m&amp;eacute;thodes priv&amp;eacute;es ajouterAuBuffer()&lt;strong&gt; &lt;/strong&gt;et telechargerSurAzure(). En effet, nous avons d&amp;eacute;cid&amp;eacute; de mettre directement dans notre observateur la logique de t&amp;eacute;l&amp;eacute;chargement de nos tweets sur un compte de stockage Windows Azure. Un attribut &lt;strong&gt;buffer &lt;/strong&gt;- tableau de bytes - stocke les tweets au fur et &amp;agrave; mesure. Un &lt;strong&gt;index&lt;/strong&gt; est incr&amp;eacute;ment&amp;eacute; pour remplir le buffer, et lorsque celui-ci arrive &amp;agrave; &amp;eacute;quivalence de la taille totale du buffer, la m&amp;eacute;thode telechargerSurAzure() est appel&amp;eacute;e. Cette m&amp;eacute;thode se charge de r&amp;eacute;cup&amp;eacute;rer le buffer pour le t&amp;eacute;l&amp;eacute;charger comme objet blob sur un conteneur Azure en particulier.&lt;/p&gt;
&lt;p align="justify"&gt;Le fichier &lt;strong&gt;App.config&lt;/strong&gt; contient les d&amp;eacute;finitions de trois param&amp;egrave;tres Windows Azure que vous aurez &amp;agrave; remplacer pour tester le code :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;accountName : le nom du compte de stockage Windows Azure.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;accountKey : la clef associ&amp;eacute;e au compte ci-dessus.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;containerRef : le nom du conteneur principal sur lequel vous voulez stocker les blobs.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;D&amp;eacute;ploiement de notre application AspirateurTwitter&lt;/h1&gt;
&lt;p align="justify"&gt;Passons maintenant au d&amp;eacute;ploiement de notre solution nomm&amp;eacute;e &amp;laquo; AspirateurTwitter &amp;raquo;.&lt;/p&gt;
&lt;h2&gt;Installation de StreamInsight Server 2.1&lt;/h2&gt;
&lt;p align="justify"&gt;Vous trouverez le guide pas &amp;agrave; pas d&amp;rsquo;installation en fran&amp;ccedil;ais &lt;a href="http://msdn.microsoft.com/fr-fr/library/ee378749.aspx"&gt;ici&lt;/a&gt;. Suivez les instructions, mais faites attention &amp;agrave; la version de StreamInsight qui est indiqu&amp;eacute;e dans un lien pour le t&amp;eacute;l&amp;eacute;charger. A l&amp;rsquo;heure actuelle, ce lien pointe sur une version ant&amp;eacute;rieure &amp;agrave; la 2.1, n&amp;eacute;anmoins vous pouvez retrouver la version 2.1 sur la page suivante : &lt;a href="http://www.microsoft.com/fr-fr/download/details.aspx?id=30149"&gt;Microsoft SQL Server StreamInsight 2.1&lt;/a&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;Note : la version dite &amp;laquo; client &amp;raquo; ne nous servira pas vis-&amp;agrave;-vis de ce tutoriel.&lt;/p&gt;
&lt;p align="justify"&gt;Une fois l&amp;rsquo;installation termin&amp;eacute;e, veuillez garder en m&amp;eacute;moire le nom du serveur d&amp;rsquo;instance StreamInsight que vous avez ajout&amp;eacute; lors de l&amp;rsquo;installation. Il nous servira par la suite.&lt;/p&gt;
&lt;h2&gt;Configuration de l&amp;rsquo;application AspirateurTwitter&lt;/h2&gt;
&lt;p align="justify"&gt;Le code source de l&amp;rsquo;application est propos&amp;eacute; en pi&amp;egrave;ce jointe de ce billet. Ouvrez la solution dans Visual Studio ; de notre c&amp;ocirc;t&amp;eacute;, nous avons utilis&amp;eacute; la version 2012.&lt;/p&gt;
&lt;p align="justify"&gt;Le projet utilise trois biblioth&amp;egrave;ques :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Microsoft CEP, install&amp;eacute; avec StreamInsight. Vous pouvez y acc&amp;eacute;der dans l&amp;rsquo;onglet &lt;strong&gt;Extensions&lt;/strong&gt; du &lt;strong&gt;Reference Manager&lt;/strong&gt;. Une biblioth&amp;egrave;que de m&amp;eacute;thodes d&amp;rsquo;extensions est aussi install&amp;eacute;e automatiquement et utilis&amp;eacute;e pour le mod&amp;egrave;le de conception Observateur : Reactive Extensions (Rx).&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;a href="http://www.nuget.org/packages/Newtonsoft.Json"&gt;Newtonsoft.Json&lt;/a&gt;, qui est ajout&amp;eacute;e avec NuGet.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Microsoft Windows Azure SDK que vous pouvez aussi r&amp;eacute;cup&amp;eacute;rer avec NuGet, ou bien installer la &lt;a href="http://www.windowsazure.com/fr-fr/downloads/"&gt;plateforme Windows Azure&lt;/a&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;Si vous ne connaissez pas NuGet, pas de panique car il est int&amp;eacute;gr&amp;eacute; &amp;agrave; Visual Studio 2012. (Pour les versions ant&amp;eacute;rieures, il vous faudra &lt;a href="http://visualstudiogallery.msdn.microsoft.com/27077b70-9dad-4c64-adcf-c7cf6bc9970c"&gt;installer une extension&lt;/a&gt;.) NuGet un gestionnaire de paquets qui t&amp;eacute;l&amp;eacute;charge automatiquement les biblioth&amp;egrave;ques externes dont vous avez besoin dans votre projet, celles-ci &amp;eacute;tant ensuite mises &amp;agrave; jour automatiquement. Vous trouverez un tutoriel sur l&amp;rsquo;utilisation de NuGet &lt;a href="http://docs.nuget.org/docs/start-here/using-the-package-manager-console"&gt;ici&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Code Source de l&amp;rsquo;application AspirateurTwitter&lt;/h2&gt;
&lt;p&gt;Le projet propos&amp;eacute; contient un fichier de configuration (&amp;laquo; .config &amp;raquo;) et 4 fichiers sources (&amp;laquo; .cs &amp;raquo;) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;App.config&lt;/strong&gt; est un fichier XML que vous devez &amp;eacute;diter pour modifier les variables de configuration Twitter, Windows Azure et StreamInsight :&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="MsoListParagraphCxSpFirst" style="margin: 0in 0in 0pt 0.5in; line-height: normal; text-indent: -0.25in; list-style-type: disc; mso-layout-grid-align: none; mso-add-space: auto; mso-list: l0 level1 lfo1;"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Segoe UI'; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes; mso-bidi-font-family: 'Segoe UI'; mso-ansi-language: en-us; mso-ascii-font-family: 'Segoe UI'; mso-hansi-font-family: 'Segoe UI';" lang="EN-US"&gt;&lt;span style="mso-list: ignore;"&gt;&lt;span style="font-size: 8pt;"&gt;-&lt;/span&gt;&lt;span style="line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;span style="font-size: 7pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Times New Roman'; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes; mso-ansi-language: en-us;" lang="EN-US"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;lt;appSettings&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; line-height: normal; text-indent: -0.25in; list-style-type: disc; mso-layout-grid-align: none; mso-add-space: auto; mso-list: l0 level1 lfo1;"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Segoe UI'; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes; mso-bidi-font-family: 'Segoe UI'; mso-ansi-language: en-us; mso-ascii-font-family: 'Segoe UI'; mso-hansi-font-family: 'Segoe UI';" lang="EN-US"&gt;&lt;span style="mso-list: ignore;"&gt;&lt;span style="font-size: 8pt;"&gt;-&lt;/span&gt;&lt;span style="line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;span style="font-size: 7pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Times New Roman'; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes; mso-ansi-language: en-us;" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;&amp;lt;!--Editez chaque valeur pour correspondre &amp;agrave; vos identifiants--&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; line-height: normal; text-indent: -0.25in; list-style-type: disc; mso-layout-grid-align: none; mso-add-space: auto; mso-list: l0 level1 lfo1;"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Segoe UI'; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes; mso-bidi-font-family: 'Segoe UI'; mso-ansi-language: en-us; mso-ascii-font-family: 'Segoe UI'; mso-hansi-font-family: 'Segoe UI';" lang="EN-US"&gt;&lt;span style="mso-list: ignore;"&gt;&lt;span style="font-size: 8pt;"&gt;-&lt;/span&gt;&lt;span style="line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;span style="font-size: 7pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Times New Roman'; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes; mso-ansi-language: en-us;" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;&amp;lt;add key="accountName" value="votre_compte_stockage_azure"/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; line-height: normal; text-indent: -0.25in; list-style-type: disc; mso-layout-grid-align: none; mso-add-space: auto; mso-list: l0 level1 lfo1;"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Segoe UI'; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes; mso-bidi-font-family: 'Segoe UI'; mso-ansi-language: en-us; mso-ascii-font-family: 'Segoe UI'; mso-hansi-font-family: 'Segoe UI';" lang="EN-US"&gt;&lt;span style="mso-list: ignore;"&gt;&lt;span style="font-size: 8pt;"&gt;-&lt;/span&gt;&lt;span style="line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;span style="font-size: 7pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Times New Roman'; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes; mso-ansi-language: en-us;" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;&amp;lt;add key="accountKey" value="votre_clef_de_stockage_azure"/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; line-height: normal; text-indent: -0.25in; list-style-type: disc; mso-layout-grid-align: none; mso-add-space: auto; mso-list: l0 level1 lfo1;"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Segoe UI'; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes; mso-bidi-font-family: 'Segoe UI'; mso-ansi-language: en-us; mso-ascii-font-family: 'Segoe UI'; mso-hansi-font-family: 'Segoe UI';" lang="EN-US"&gt;&lt;span style="mso-list: ignore;"&gt;&lt;span style="font-size: 8pt;"&gt;-&lt;/span&gt;&lt;span style="line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;span style="font-size: 7pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Times New Roman'; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes; mso-ansi-language: en-us;" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;&amp;lt;add key="containerRef" value="votre_conteneur_principal_azure"/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; line-height: normal; text-indent: -0.25in; list-style-type: disc; mso-layout-grid-align: none; mso-add-space: auto; mso-list: l0 level1 lfo1;"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Segoe UI'; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes; mso-bidi-font-family: 'Segoe UI'; mso-ansi-language: en-us; mso-ascii-font-family: 'Segoe UI'; mso-hansi-font-family: 'Segoe UI';" lang="EN-US"&gt;&lt;span style="mso-list: ignore;"&gt;&lt;span style="font-size: 8pt;"&gt;-&lt;/span&gt;&lt;span style="line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;span style="font-size: 7pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Times New Roman'; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes; mso-ansi-language: en-us;" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;&amp;lt;add key="twitterAccount" value="votre_identifiant_twitter"/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; line-height: normal; text-indent: -0.25in; list-style-type: disc; mso-layout-grid-align: none; mso-add-space: auto; mso-list: l0 level1 lfo1;"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Segoe UI'; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes; mso-bidi-font-family: 'Segoe UI'; mso-ansi-language: en-us; mso-ascii-font-family: 'Segoe UI'; mso-hansi-font-family: 'Segoe UI';" lang="EN-US"&gt;&lt;span style="mso-list: ignore;"&gt;&lt;span style="font-size: 8pt;"&gt;-&lt;/span&gt;&lt;span style="line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;span style="font-size: 7pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Times New Roman'; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes; mso-ansi-language: en-us;" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;&amp;lt;add key="twitterPass" value="votre_mot_de_passe_twitter"/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpLast" style="margin: 0in 0in 0pt 0.5in; line-height: normal; text-indent: -0.25in; list-style-type: disc; mso-layout-grid-align: none; mso-add-space: auto; mso-list: l0 level1 lfo1;"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Segoe UI'; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes; mso-bidi-font-family: 'Segoe UI'; mso-ansi-language: en-us; mso-ascii-font-family: 'Segoe UI'; mso-hansi-font-family: 'Segoe UI';" lang="EN-US"&gt;&lt;span style="mso-list: ignore;"&gt;&lt;span style="font-size: 8pt;"&gt;-&lt;/span&gt;&lt;span style="line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;span style="font-size: 7pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Times New Roman'; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes; mso-ansi-language: en-us;" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;&amp;lt;add key="serveurStreamInsight" value="nom_du_serveur_stream_insight"/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 6pt 0.25in; line-height: 11pt; list-style-type: disc;"&gt;&lt;span style="line-height: 9pt; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Times New Roman'; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes; mso-ansi-language: en-us;" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;&amp;lt;/appSettings&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;strong&gt;Program.cs&lt;/strong&gt; est la classe principale de notre application. La fonction Main() est ex&amp;eacute;cut&amp;eacute;e et contient les instructions d&amp;rsquo;instanciation de nos classe Observable et Observateur.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;strong&gt;SourceTwitter.cs&lt;/strong&gt; est la classe impl&amp;eacute;mentant IObservable&amp;lt;T&amp;gt;. La m&amp;eacute;thode Subscribe() est la seule surcharge n&amp;eacute;cessaire &amp;agrave; r&amp;eacute;aliser pour r&amp;eacute;pondre au contrat de IObservable&amp;lt;T&amp;gt;. Dans cette classe, on &amp;eacute;coute l&amp;rsquo;API Streaming de Twitter, on parse le texte au format JSON renvoy&amp;eacute;, puis on le stocke dans un objet de type Tweet.cs et enfin, on notifie les observateurs.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;strong&gt;ObservateurTwitter.cs&lt;/strong&gt; est la classe impl&amp;eacute;mentant IObserver&amp;lt;T&amp;gt;. Les m&amp;eacute;thodes OnNext(), OnCompleted() et OnError() sont n&amp;eacute;cessaire &amp;agrave; la validation du contrat.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;strong&gt;Tweet.cs&lt;/strong&gt; est la classe de base stockant un tweet sous forme d&amp;rsquo;objet. La m&amp;eacute;thode ToString() retourne une chaine de caract&amp;egrave;res format&amp;eacute;e de la mani&amp;egrave;re suivant :&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;span style="text-align: left; line-height: 9pt; list-style-type: disc; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Times New Roman'; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes; mso-ansi-language: en-us; mso-fareast-language: en-us; mso-bidi-language: ar-sa;" lang="EN-US"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;lt;id&amp;gt;[tabulation]&amp;lt;createdAt&amp;gt;[tabulation]&amp;lt;userName&amp;gt;[tabulation]&amp;lt;text&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Le sch&amp;eacute;ma ci-dessous indique le cheminent d&amp;rsquo;un tweet dans notre application AspirateurTwitter:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/6012.image_5F00_58BD2C2C.png"&gt;&lt;img style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" title="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/8130.image_5F00_thumb_5F00_6EC397BE.png" alt="image" width="475" height="356" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Pourquoi une taille de 255 Mo (267386880 octets) ? Par exp&amp;eacute;rience, le traitement Map/Reduce d&amp;rsquo;une (possible future) application Big Data sur Windows Azure HDInsight lit de mani&amp;egrave;re distribu&amp;eacute;e les donn&amp;eacute;es contenues dans un seul conteneur par block de 255 Mo. Avec cette astuce, nous optimisons le traitement futur et &amp;eacute;vitons ainsi une baisse de performance. Maintenant, vous pouvez tester avec une valeur inf&amp;eacute;rieure - modifiez la constante dans ObservateurTwitter &lt;strong&gt;tailleBuffer&lt;/strong&gt; - sinon cela risque d&amp;rsquo;&amp;ecirc;tre long avant que vous puissiez voir un r&amp;eacute;sultat.&lt;/p&gt;
&lt;p align="justify"&gt;Une derni&amp;egrave;re chose &amp;agrave; pr&amp;eacute;ciser, le stockage dans Windows Azure d&amp;rsquo;un &lt;strong&gt;blob&lt;/strong&gt; s&amp;rsquo;effectue dans un dossier &amp;laquo; input &amp;raquo; (en partant de racine du conteneur), puis est r&amp;eacute;pertori&amp;eacute; par date de t&amp;eacute;l&amp;eacute;chargement. Le fichier poss&amp;egrave;de un nom unique, en r&amp;eacute;alit&amp;eacute; un nombre repr&amp;eacute;sentant le TimeStamp du syst&amp;egrave;me d&amp;rsquo;exploitation lors de l&amp;rsquo;enregistrement du fichier.&lt;/p&gt;
&lt;h1&gt;En guise de conclusion&lt;/h1&gt;
&lt;p align="justify"&gt;Ce tutoriel tire &amp;agrave; sa fin. Ce dernier a illustr&amp;eacute; comment &amp;eacute;crire une application CEP sur StreamInsight 2.1 avec le &lt;strong&gt;mod&amp;egrave;le de conception Observateur&lt;/strong&gt;, et ce, avec un minimum de code. Comme indiqu&amp;eacute; pr&amp;eacute;c&amp;eacute;demment, le code source est accessible dans le projet AspirateurTwitter propos&amp;eacute; en pi&amp;egrave;ce jointe de ce billet.&lt;/p&gt;
&lt;p align="justify"&gt;Si vous avez envie de pousser plus loin vos investigations sur cette technologie StreamInsight, voici quelques ressources utiles :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Le &lt;a href="http://msdn.microsoft.com/fr-fr/library/hh750619(v=sql.10).aspx"&gt;sommaire de la documentation&lt;/a&gt;, un classique qui plus est disponible en fran&amp;ccedil;ais.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Le &lt;a href="http://social.technet.microsoft.com/wiki/contents/articles/14436.get-started-with-streaminsight-2-1.aspx"&gt;Guide de d&amp;eacute;marrage (getting started)&lt;/a&gt; de StreamInsight qui vous apportera les notions de bases.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Un &lt;a href="http://channel9.msdn.com/Series/Rx-Workshop/Rx-Workshop-Event-Processing"&gt;workshop sur l&amp;rsquo;architecture Event Processing et LINQ&lt;/a&gt; sur Channel 9, le site de vid&amp;eacute;os didactiques pour la communaut&amp;eacute;.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;Pour vous tenir inform&amp;eacute;(e) des nouveaut&amp;eacute;s et exemples, n&amp;rsquo;h&amp;eacute;sitez pas &amp;agrave; consulter le &lt;a href="http://blogs.msdn.com/b/streaminsight/"&gt;blog MSDN d&amp;eacute;di&amp;eacute;&lt;/a&gt;. Mentionnons enfin un billet sur &lt;a href="http://blogs.msdn.com/b/streaminsight/archive/2011/07/28/new-in-v1-2-linq-macros.aspx"&gt;les macros LINQ&lt;/a&gt; qui d&amp;eacute;taille quelques cas d&amp;rsquo;utilisation.&lt;/p&gt;
&lt;p align="justify"&gt;Merci de votre lecture et &amp;agrave; tr&amp;egrave;s bient&amp;ocirc;t pour de nouvelles d&amp;eacute;couvertes !&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://fierdetredeveloppeur.org/"&gt;&lt;img style="border: 0px currentcolor; display: inline; background-image: none;" title="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/7571.image_5F00_7A0CABFB.png" alt="image" width="104" height="104" border="0" /&gt;&lt;/a&gt;&lt;a href="http://fierdetredeveloppeur.org/"&gt;&lt;img style="border: 0px currentcolor; display: inline; background-image: none;" title="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/5342.image_5F00_6B620016.png" alt="image" width="105" height="104" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10418906" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-10-41-89-06/AspirateurTwitter.zip" length="9865" type="application/zip" /><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/StreamInsight/">StreamInsight</category><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Windows+Azure+HDInsight/">Windows Azure HDInsight</category></item><item><title>Big Data et Data Explorer</title><link>http://blogs.msdn.com/b/big_data_france/archive/2013/05/13/big-data-et-data-explorer.aspx</link><pubDate>Mon, 13 May 2013 14:56:04 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10418140</guid><dc:creator>Philippe Beraud - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/big_data_france/rsscomments.aspx?WeblogPostID=10418140</wfw:commentRss><comments>http://blogs.msdn.com/b/big_data_france/archive/2013/05/13/big-data-et-data-explorer.aspx#comments</comments><description>&lt;p align="justify"&gt;&lt;i&gt;Comme nous avons pu déjà le souligner, ce blog se veut un cadre d’échanges et de partage avec la mise en avant de problématiques données assorties de la proposition de scénarios/solutions type prêts à l’usage. Ainsi, pour rentrer de façon pragmatique dans le monde du &lt;/i&gt;&lt;a href="http://twitter.com/search?q=%23bigdata"&gt;&lt;i&gt;#BigData&lt;/i&gt;&lt;/a&gt;&lt;i&gt;, l’objectif que nous nous sommes fixé consiste notamment à partager des focus particuliers sur la mise en œuvre concrète d’une technologie particulière ou d’un ensemble de technologies dans le contexte des &lt;/i&gt;&lt;a href="http://www.microsoft.com/bigdata"&gt;&lt;i&gt;solutions Microsoft pour le Big Data&lt;/i&gt;&lt;/a&gt;&lt;i&gt;. &lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.azeo.com/"&gt;&lt;img title="image" style="border: 0px currentcolor; display: inline; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/0842.image_5F00_54AAB717.png" width="169" height="56" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;i&gt;A ce propos, J’ai aujourd’hui le plaisir de publier dans ce blog ce billet rédigé par &lt;/i&gt;&lt;a href="http://blog.djeepy1.net/"&gt;&lt;i&gt;Jean-Pierre Riehl&lt;/i&gt;&lt;/a&gt;&lt;i&gt;, responsable de Practice Data &amp;amp; Business Intelligence de la société &lt;/i&gt;&lt;a href="http://www.azeo.com/"&gt;&lt;i&gt;AZEO&lt;/i&gt;&lt;/a&gt;&lt;i&gt;. Je profite de cette occasion pour remercier très sincèrement Jean-Pierre pour cette contribution.&lt;/i&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;i&gt;Jean-Pierre est &lt;/i&gt;&lt;a href="http://mvp.microsoft.com/en-us/mvp/Jean-Pierre%20Riehl-4020744"&gt;&lt;i&gt;MVP SQL Server&lt;/i&gt;&lt;/a&gt;&lt;i&gt; et fait partie du « board » du Groupe des Utilisateurs SQL Server. &lt;/i&gt;&lt;i&gt;Très impliqué sur les usages Self-Service du décisionnel, il suit de très près le dernier outil Data Explorer, véritable Self-Service ETL embarqué dans Excel.&lt;/i&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;i&gt;Je vous souhaite une bonne lecture de ce billet et n’hésitez pas à consulter sur le &lt;/i&gt;&lt;a href="http://blog.djeepy1.net/"&gt;&lt;i&gt;blog de Jean-Pierre&lt;/i&gt;&lt;/a&gt;&lt;i&gt; les autres billets consacrés à Data Explorer.&lt;/i&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;i&gt;--Philippe&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;________________________________________________________________________________________________&lt;/i&gt;&lt;/p&gt;  &lt;p align="justify"&gt;L'un des enjeux des Big Data est de pouvoir les utiliser. Pour reprendre un célèbre slogan, “&lt;i&gt;à quoi ça sert d'avoir des data si c'est pour rien faire avec&lt;/i&gt;”.&lt;/p&gt;  &lt;p align="justify"&gt;Souvent associé avec le requêtage des Big Data, on a l'image d'un scientifique (Data Scientist) ou d'un geek nourri aux pizzas, les 2 écrivant des requêtes complexes dans un langage dont on reconnait des morceaux mais qu'on ne comprend jamais vraiment bien.&lt;/p&gt;  &lt;p align="justify"&gt;La réalité est bien différente ; non pas qu'il n'y ait pas de scientifiques ou de geeks, mais on trouve une boite à outil très riche pour exploiter nos données Big Data.&lt;/p&gt;  &lt;p align="justify"&gt;C'est d'autant plus vrai dans l'univers Microsoft où l'on dispose des drivers, langages et outils intégrés à un écosystème riche et existant. Grace à &lt;a href="http://hive.apache.org/"&gt;Hive&lt;/a&gt;, on peut requêter nos données avec un langage SQL depuis Excel, &lt;a href="http://www.microsoft.com/en-us/sqlserver/solutions-technologies/enterprise-information-management/integration-services.aspx"&gt;SSIS (SQL Server Integration Services)&lt;/a&gt; ou .Net. Grace à &lt;a href="http://www.microsoft.com/en-us/sqlserver/solutions-technologies/data-warehousing/polybase.aspx"&gt;PolyBase&lt;/a&gt;, on peut mixer nos Big Data avec un Data Warehouse d'entreprise en faisant des jointures entre les deux.&lt;/p&gt;  &lt;p align="justify"&gt;L'objet de cet article est de présenter un petit nouveau dans cette boite à outils : &lt;a href="http://www.microsoft.com/en-us/download/details.aspx?id=36803"&gt;Data Explorer&lt;/a&gt;.&lt;/p&gt;  &lt;h1&gt;Data Explorer, c’est quoi ?&lt;/h1&gt;  &lt;p align="justify"&gt;Data Explorer est un add-in à Excel permettant de faire du « shaping » et du « mashup » de données. En français, on pourrait parler de façonnage (je ne parle pas de mise en forme) et de composition (au sens de mélanger). Derrière ces mots barbares, on trouve toutes les opérations qui permettent de prendre des jeux de données quelconques et de le transformer en un Dataset exploitable : exploitable pour du reporting mais également pour de l'analyse de données bien évidemment.&lt;/p&gt;  &lt;p align="justify"&gt;Les développeurs trouveront que cet outil ressemble (fonctionnellement) à un ETL comme SSIS et ils auront totalement raison, tout du moins dans sa partie flux de données. On parle d'ailleurs de Self-Service ETL.&lt;/p&gt;  &lt;p align="justify"&gt;Cet add-in Excel orienté utilisateur est gratuit et complète parfaitement l'offre de Self-Service BI de Microsoft et en particulier PowerPivot et Power View. C'est un point important ! Ce n'est pas un outil de développeur, c'est bien un outil pour l'utilisateur final. Il est d'ailleurs également important de noter qu'il fonctionne sous Excel 2013 - on s'en serait douté -, mais également sous Excel 2010, comme PowerPivot ; ce qui lui donne une cible d'utilisateurs très large. &lt;/p&gt;  &lt;h1&gt;Mais le lien avec les Big Data ?&lt;/h1&gt;  &lt;p align="justify"&gt;C'est simple, parmi la multitude de sources que prend en entrée Data Explorer, il y a des sources HDInsight que ce soit &lt;a href="http://www.windowsazure.com/en-us/manage/services/hdinsight/"&gt;Windows Azure HDInsight&lt;/a&gt; ou &lt;a href="http://www.microsoft.com/web/gallery/install.aspx?appid=HDINSIGHT-PREVIEW"&gt;HDInsight Server&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Si je rapproche cela du fait qu'on est sur un outil pour les utilisateurs métiers - ou finaux, appelez les comme vous voulez -, on voit tout de suite l'intérêt. &lt;/p&gt;  &lt;p align="justify"&gt;Nos Big Data ne sont plus réservées aux seuls développeurs mais sont utilisables par tous et surtout par les consommateurs les plus intéressés.&lt;/p&gt;  &lt;p align="justify"&gt;Regardons un peu plus tout cela dans le détail. Mettons-nous à la place de notre utilisateur métier. Et sa première question sera &amp;quot;&lt;i&gt;mais quelle source dois-je prendre&lt;/i&gt;&amp;quot; ?&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/7853.image_5F00_216E7DAE.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/0116.image_5F00_thumb_5F00_564B5D1E.png" width="284" height="344" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt; &lt;strong&gt;&lt;/strong&gt;  &lt;table cellspacing="0" cellpadding="2" width="592" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="149"&gt;&lt;strong&gt;Source&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="441"&gt;&lt;strong&gt;Usage&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="149"&gt;         &lt;p align="justify"&gt;Hadoop File (HDFS)&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="441"&gt;         &lt;p align="justify"&gt;On requête l'endroit où sont stockées nos données Big Data, c’est-à-dire un stockage HDFS et donc &lt;b&gt;orienté fichiers&lt;/b&gt;. &lt;/p&gt;          &lt;p align="justify"&gt;Qu'importe ce qu'il y a derrière, un serveur unique ou des centaines de machines, on donne juste l'adresse du cluster HDFS sous la forme : &lt;b&gt;hdfs://monclusterHDFS&lt;/b&gt;&lt;/p&gt;          &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/1121.image_5F00_12477907.png"&gt;&lt;img title="image" style="border: 0px currentcolor; display: inline; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/6758.image_5F00_thumb_5F00_57EC0325.png" width="388" height="138" /&gt;&lt;/a&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="149"&gt;         &lt;p align="justify"&gt;Windows Azure HDInsight&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="441"&gt;         &lt;p align="justify"&gt;Windows Azure HDInsight est un service Azure qui va gérer le stockage HDFS. HDInsight va nous offrir la puissance de calcul d'un cluster Hadoop (Map/Reduce, Hive, Pig, etc.).&lt;/p&gt;          &lt;p align="justify"&gt;Toutefois, Data Explorer va se brancher sur les données brutes à savoir le Blob Storage qui contient les données. On ne pourra donc pas utiliser la puissance de calcul du Cloud.&lt;/p&gt;          &lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/5224.image_5F00_6FA33A8B.png"&gt;&lt;img title="image" style="border: 0px currentcolor; display: inline; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/0513.image_5F00_thumb_5F00_4E4394EF.png" width="384" height="137" /&gt;&lt;/a&gt;&lt;/p&gt;          &lt;p align="justify"&gt;Pour cela, on va renseigner notre compte Blob Storage et on va pouvoir requêter les Containers qui s'y trouvent.&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p align="justify"&gt;Pour cela, on va renseigner notre compte Blob Storage et on va pouvoir requêter les Containers qui s'y trouvent.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/6886.image_5F00_016FA88C.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/0081.image_5F00_thumb_5F00_1A1ECFCF.png" width="580" height="261" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Ici, j'ai téléchargé un fichier contenant un flux Twitter.&lt;/p&gt;  &lt;p align="justify"&gt;Côté Excel, je m'y connecte via Data Explorer en précisant mon compte ainsi que la clé d'accès (en effet, ces données ne sont pas publiques).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/5670.image_5F00_6FEF21E6.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/4073.image_5F00_thumb_5F00_1F5D90B3.png" width="462" height="347" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Dans l'interface de Data Explorer, on voit les Containers de mon BlobStorage dans la zone de navigation de la source de données. On notera aussi que dans la barre de formule (&lt;b&gt;Settings&lt;/b&gt; –&amp;gt; &lt;b&gt;Show Formula Bar&lt;/b&gt;), la source se requête de la façon suivante : &lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNoSpacing" style="margin: 0in 0in 6pt; list-style-type: disc;" align="center"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;=HDInsight.Contents(&amp;quot;BlobStorageName&amp;quot;)&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-bidi-font-family: &amp;quot;Segoe UI&amp;quot;; mso-bidi-theme-font: minor-latin; mso-ansi-language: fr;"&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;h1&gt;Et on en fait quoi ?&lt;/h1&gt;  &lt;p align="justify"&gt;Mais replaçons-nous au niveau d'un utilisateur métier. Ce dernier va naviguer pour arriver jusqu'aux données « finales » et ce d'abord au niveau fichier - ici il n'y en a qu'un dans le container.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/6404.image_5F00_7CB95237.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/8424.image_5F00_thumb_5F00_737D16F6.png" width="462" height="131" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Puis on va pouvoir descendre dans le contenu en cliquant sur les 2 petites flèches de la colonne &lt;b&gt;Content&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/7343.image_5F00_461B8126.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/6175.image_5F00_thumb_5F00_0A0F3F71.png" width="463" height="209" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;On a maintenant la liste de tous nos Tweets au format JSON, format riche mais compliqué à exploiter. Ça tombe bien car Data Explorer sait l'interpréter :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;On transforme les données sous la forme d’une table pour pouvoir les exploiter &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;On supprime la première ligne d'entête &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;On transforme la colonne en JSON et on obtient une table contenant le type Record qui représente les objets à manipuler&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/0564.image_5F00_4AEE0F15.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/7608.image_5F00_thumb_5F00_130BA525.png" width="372" height="324" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;On va dé-normaliser chaque Record en récupérer les clés/valeurs. Cela se fait avec l'icône en haut à droite de la colonne. La liste des champs trouvés s'affiche et on peut même rechercher parmi eux via la textbox du haut.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/7167.image_5F00_5B293B34.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/8611.image_5F00_thumb_5F00_31D1F336.png" width="460" height="393" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;On récupère la date, le texte et l'utilisateur. Ce dernier est de nouveau de type Record (c'est la force du format JSON) et donc on réitère l'opération pour récupérer son nom &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;On termine notre shaping en renommant les colonnes et en mettant les bons types (la date en particulier). &lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Une fois tout cela effectué nous disposons d'un Dataset prêt à être exploité dans Excel, PowerPivot, Power View ou encore &lt;a href="http://blog.djeepy1.net/tag/geoflow/"&gt;Geoflow&lt;/a&gt;. D’ailleurs, Data Explorer permet justement de charger le résultat directement dans le Data Model de PowerPivot.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/2500.image_5F00_3D873A68.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/1651.image_5F00_thumb_5F00_196EB34E.png" width="548" height="318" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Evidemment Data Explorer ne nous sert pas qu'à renommer des colonnes ou simplement sélectionner des données. On peut croiser ces données avec d'autres jeux de données (jointure, union, etc.), les transformer, les pivoter, etc. On peut même étendre les fonctions de base en développant des fonctions avancées (ex : géocoding avec Bing Maps, API de qualification du texte, etc.) comme illustré notamment &lt;a href="http://blogs.msdn.com/b/ogdifrance/archive/2013/04/24/ogdi-datalab-et-l-extension-data-explorer-pour-microsoft-excel-2013.aspx"&gt;ici&lt;/a&gt;.&lt;/p&gt;  &lt;h1&gt;On récapitule&lt;/h1&gt;  &lt;p align="justify"&gt;Data Explorer permet de récupérer et transformer des données Big Data comme n'importe quelle autre source. On se connecte sur nos Blob Azure (ou bien sur notre cluster HDFS) et nous avons accès à toutes les fonctions de manipulation des données de l'outil.&lt;/p&gt;  &lt;p align="justify"&gt;En sortie, on obtient un Dataset &amp;quot;&lt;i&gt;propre&lt;/i&gt;&amp;quot;, directement utilisable dans Excel, comme n'importe quelle autre table.&lt;/p&gt;  &lt;p align="justify"&gt;On est dans un scénario BI (Business Intelligence) typique : &lt;b&gt;transformer des données brutes en information&lt;/b&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/2117.image_5F00_1F39311A.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/7752.image_5F00_thumb_5F00_6EC2ACA3.png" width="493" height="278" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h1&gt;Mais comment positionne-t-on l'usage exactement ?&lt;/h1&gt;  &lt;p align="justify"&gt;En effet, l'outil est simple, séduisant mais comment le place-t-on dans notre Système d'Information ?&lt;/p&gt;  &lt;p align="justify"&gt;Je vois 2 usages principaux :&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Le premier est évidemment la mise à disposition d'un &amp;quot;&lt;b&gt;requêteur&lt;/b&gt;&amp;quot; permettant de faire des analyses sur des données en provenance de notre système Big Data.         &lt;br /&gt;C'est trivial mais un nouvel outil pour manipuler du Big Data n'est pas de trop étant donné l'outillage actuel, surtout quand il est aussi simple et vise une large population de l'entreprise.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Le second usage identifié est très intéressant ; c'est un usage de &lt;b&gt;prototypage&lt;/b&gt;. Avant de mettre en place un projet plus ou moins complexe de Big Data, que ce soit au niveau du stockage des données ou des services de requêtage, il est peut-être pertinent d'en valider l'utilisation &amp;quot;Business&amp;quot;.         &lt;br /&gt;Avant de monter sa solution de Big Data, avant s'y déverser des « tombereaux » de données Twitter, Facebook, logs web et consorts, avant de lancer les équipes dans des algorithmes MapR et dans du requêtage Pig, Hive ou autre ; avant d'activer ces moyens, n'est-il pas pertinent de valider que l'aiguille se trouve bien dans la botte de foin ?&lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;h1&gt;Comment Démarrer ?&lt;/h1&gt;  &lt;p align="justify"&gt;Convaincu ? L'avantage, c'est que vous pouvez démarrer tout de suite : :)&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Télécharger &lt;a href="http://www.microsoft.com/en-us/download/details.aspx?id=36803"&gt;Data Explorer&lt;/a&gt;.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Tester le &lt;a href="http://www.windowsazure.com/en-us/"&gt;Blob Storage d'Azure&lt;/a&gt;. &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Tester &lt;a href="http://www.windowsazure.com/en-us/manage/services/hdinsight/"&gt;Windows Azure HDInsight&lt;/a&gt;.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Récupérer des données &lt;a href="http://www.windowsazure.com/en-us/manage/services/hdinsight/analyzing-twitter-data-with-hive/"&gt;Twitter&lt;/a&gt;. &lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10418140" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/HDInsight+Server/">HDInsight Server</category><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Windows+Azure+HDInsight/">Windows Azure HDInsight</category><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Data+Explorer/">Data Explorer</category><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Excel+2013/">Excel 2013</category></item><item><title>Le Microsoft Research Machine Learning Summit en webcasts à la demande !</title><link>http://blogs.msdn.com/b/big_data_france/archive/2013/04/25/le-microsoft-research-machine-learning-summit-en-webcasts-224-la-demande.aspx</link><pubDate>Thu, 25 Apr 2013 08:31:01 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10413890</guid><dc:creator>Philippe Beraud - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/big_data_france/rsscomments.aspx?WeblogPostID=10413890</wfw:commentRss><comments>http://blogs.msdn.com/b/big_data_france/archive/2013/04/25/le-microsoft-research-machine-learning-summit-en-webcasts-224-la-demande.aspx#comments</comments><description>&lt;p align="justify"&gt;Nous l’évoquions brièvement dans le &lt;a href="http://blogs.msdn.com/b/big_data_france/archive/2013/04/24/apprentissage-automatique-machine-learning.aspx"&gt;billet précédent&lt;/a&gt;, Microsoft France a accueilli au Centre de conférence ces 23 et 24 avril &lt;a href="http://research.microsoft.com/en-us/people/rashid/"&gt;Rick Rashid&lt;/a&gt;, Chief Research Officer de Microsoft, ainsi que les meilleurs chercheurs de nos laboratoires de Redmond, Silicon Valley, Bangalore, Cambridge, etc. pour le &lt;a href="http://research.microsoft.com/en-us/um/cambridge/events/mls2013/default.aspx"&gt;Microsoft Research Machine Learning Summit&lt;/a&gt;, une conférence au sommet autour du Big Data et du « Machine Learning », à destination d’un public de chercheurs et universitaires venus de toute l’Europe. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/7635.image_5F00_5105CDCC.png"&gt;&lt;img title="image" style="border: 0px currentcolor; display: inline; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/8765.image_5F00_thumb_5F00_51DA1FB7.png" width="173" height="209" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Vous pouvez visionner le « teaser » de la conférence &lt;a href="http://research.microsoft.com/apps/video/default.aspx?id=189705"&gt;ici&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Lors de l’édition 2013 des Microsoft TechDays, et en particulier lors de la plénière &lt;a href="http://www.microsoft.com/france/mstechdays/programmes/2013/fiche-session.aspx?ID=86180f9d-8abf-4fa4-881a-eced31e2a30e"&gt;Bienvenue dans l'océan numérique (KEY203)&lt;/a&gt;, nous explorions déjà les perspectives et opportunités d’un monde dans lequel Big Data et « Machine Learning » sont à l’œuvre pour transformer notre vie et celle de nos entreprises. &lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;L’objet du Machine Learning Summit est de faire le point avec les plus grands experts du domaine, chez Microsoft mais aussi ceux des meilleurs laboratoires américains ou européens - dont l’Inria (Institut national de recherche en informatique et en automatique) - sur l’état de l’art et ses applications à des domaines aussi variés que social data, vidéo, médecine, etc. Le programme détaillé de la conférence est précisé &lt;a href="http://research.microsoft.com/en-us/um/cambridge/events/mls2013/agenda.htm"&gt;ici&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Le « Machine Learning » est une vraie &lt;b&gt;révolution dans le logiciel&lt;/b&gt; : probabilités et statistiques sur les masses de données&amp;#160; permettent au logiciel « d’apprendre » et non seulement calculer. Nouvelle frontière, nouvelle façon de penser le logiciel et de le programmer, c’est une révolution qui replace la « Big Science » au cœur de l’innovation. &lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;b&gt;Microsoft est à la pointe dans ce domaine&lt;/b&gt; : le moteur de Kinect en est le meilleur exemple, il est issu de recherches en Machine Learning menées à Microsoft Research Cambridge et ses « concepteurs » étaient présents à la conférence. Vous pouvez retrouver les différents travaux, projets et publications &lt;a href="http://research.microsoft.com/en-us/about/our-research/machine-learning.aspx"&gt;ici&lt;/a&gt;. &lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;b&gt;Notre &lt;/b&gt;&lt;a href="http://www.msr-inria.com/"&gt;&lt;b&gt;laboratoire commun Inria-Microsoft Research&lt;/b&gt;&lt;/a&gt;&lt;b&gt; se mobilise également sur ce sujet.&lt;/b&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Enfin,&lt;b&gt; la recherche française a des atouts uniques pour exceller en « Machine Learning » &lt;/b&gt;: une « école » statistique reconnue mondialement, des Grandes Ecoles&amp;#160; comme l’ENS (Ecole Normale Supérieure) ou les Mines qui forment les meilleurs étudiants au contact de chercheurs émérites (notamment de l’Inria) ou nos Universités qui comptent des lauréats de la médaille Fields et des prix Nobel de physique !&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Au-delà du &lt;a href="http://research.microsoft.com/apps/video/default.aspx?id=191945"&gt;discours d’ouverture&lt;/a&gt; de la conférence, les plénières ainsi que les principales sessions sont désormais accessibles (ou sur le point de l’être) sous forme de webcasts à la demande &lt;a href="http://research.microsoft.com/en-us/um/cambridge/events/mls2013/virtual-streaming/virtualmachinelearningsummit.aspx"&gt;ici&lt;/a&gt;, à l’image de :&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;p align="justify"&gt;&lt;/p&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;b&gt;&lt;a href="http://research.microsoft.com/apps/video/default.aspx?id=191944"&gt;Plenary 1 Keynote: Machines that (Learn to) See&lt;/a&gt;&lt;/b&gt; avec, comme speaker, &lt;a href="http://research.microsoft.com/en-us/press/ablake.aspx"&gt;Andrew Blake&lt;/a&gt;&lt;b&gt;,&lt;/b&gt; Distinguished Scientist et directeur de Microsoft Research Cambridge, United Kingdom. Andrew Blake est un spécialiste du traitement d’image et de vidéo. Il était le leader côté Microsoft Research de « &lt;a href="http://research.microsoft.com/apps/video/default.aspx?id=144455"&gt;Project Natal&lt;/a&gt; » qui a donné Kinect tel que nous le connaissons aujourd’hui.&lt;/div&gt;   &lt;/li&gt;    &lt;p align="justify"&gt;&lt;/p&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;b&gt;&lt;a href="http://research.microsoft.com/apps/video/default.aspx?id=191888"&gt;Plenary 2 Keynote: The Mathematics of Causal Inference: with Reflections on Machine Learning&lt;/a&gt;&lt;strong&gt; avec, comme, speaker, &lt;/strong&gt;&lt;/b&gt;&lt;a href="http://bayes.cs.ucla.edu/jp_home.html"&gt;Judea Pearl&lt;/a&gt;&lt;b&gt;,&lt;/b&gt; Professeur d’informatique et de statistiques, directeur du « Cognitive Systems Laboratory » à&amp;#160; UCLA (University of California, Los Angeles), et également &lt;a href="http://amturing.acm.org/award_winners/pearl_2658896.cfm"&gt;Turing Award&amp;#160; 2011&lt;/a&gt;, c.à.d. le « prix Nobel de l’informatique » pour sa contribution à la recherche en intelligence artificielle. &lt;/div&gt;   &lt;/li&gt;    &lt;p align="justify"&gt;&lt;/p&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;b&gt;Research in Focus – Teaching Machines to See&lt;strong&gt; avec notamment comme speaker &lt;/strong&gt;&lt;/b&gt;&lt;a href="http://vision.stanford.edu/"&gt;Fei-Fei Li&lt;/a&gt;, professeur associé et directeur du laboratoire de « Computer Vision » de l’université de Stanford.&lt;/div&gt;   &lt;/li&gt;    &lt;p align="justify"&gt;&lt;/p&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Etc.&lt;b&gt; &lt;/b&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;p align="justify"&gt;&lt;/p&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Bon visionnage !&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10413890" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Machine+Learning/">Machine Learning</category></item><item><title>Apprentissage automatique (Machine Learning)</title><link>http://blogs.msdn.com/b/big_data_france/archive/2013/04/24/apprentissage-automatique-machine-learning.aspx</link><pubDate>Wed, 24 Apr 2013 08:41:55 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10413589</guid><dc:creator>Philippe Beraud - MSFT</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/big_data_france/rsscomments.aspx?WeblogPostID=10413589</wfw:commentRss><comments>http://blogs.msdn.com/b/big_data_france/archive/2013/04/24/apprentissage-automatique-machine-learning.aspx#comments</comments><description>&lt;blockquote&gt;   &lt;p&gt;L’apprentissage automatique, c’est la capacité d’un ordinateur à apprendre sans avoir été explicitement programmé. &lt;/p&gt;    &lt;p&gt;&lt;a href="http://infolab.stanford.edu/pub/voy/museum/samuel.html"&gt;Arthur Samuel&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;Hier matin, en me rendant dans les locaux de Microsoft France où se déroule au Centre de conférence ces 23 et 24 avril le &lt;a href="http://research.microsoft.com/en-us/um/cambridge/events/mls2013/default.aspx"&gt;Microsoft Research Machine Learning Summit&lt;/a&gt; - une conférence au sommet autour du Big Data et du « Machine Learning&amp;#160; » à destination d’un public de chercheurs et universitaires venus de toute l’Europe -, un panneau au pied du pont du Garigliano indiquait : &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Périphérique intérieur =&amp;gt; fluide&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Périphérique extérieur =&amp;gt; 6 min Porte d’Orléans&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;De là est partie la (petite) réflexion suivante : si nous changeons le second affichage (c.à.d. Périphérique extérieur) par ceci : &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Périphérique intérieur =&amp;gt; fluide&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;L’autre : 6min Porte d’Orléans&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Nous comprenons que l’affichage, « l’autre » en l’occurrence, correspond au périphérique extérieur. Cette relation, nous la faisons naturellement et sans réfléchir au préalable.&lt;/p&gt;  &lt;p align="justify"&gt;Des associations comme celle-ci nous en faisons régulièrement et si, par exemple, nous changeons le sujet en prenant comme phrase « La voiture est en panne, je prends l’autre », &lt;b&gt;l’autre&lt;/b&gt; correspond cette fois à une deuxième voiture implicite.&lt;/p&gt;  &lt;p align="justify"&gt;Le mot « autre » est associé dans ces deux exemples à des entités complètement différentes. Pourtant notre cerveau arrive à faire la déduction naturellement grâce au &lt;b&gt;contexte&lt;/b&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Le premier exemple sur le périphérique décrit deux types : intérieur et extérieur. Ce sont des termes opposés c’est-à-dire que l’alternative à intérieur est extérieur. &lt;/p&gt;  &lt;p align="justify"&gt;Comment le sait-on ? Cela fait partie de notre cadre de référence qui est constitué d’informations et d’expériences dépendantes de l’environnement dans lequel nous évoluons et de l’apprentissage que nous avons reçu. &lt;/p&gt;  &lt;p align="justify"&gt;Nous possédons donc déjà un cadre de référence qui nous permet de faire des déductions, de prendre des décisions en fonction du contexte. Par contre, si nous prenons le cas d’un enfant, plus il sera jeune, moins il déduira le déroulement d’actions car sa phase d’apprentissage sera moindre.&lt;/p&gt;  &lt;h1&gt;Principes de fonctionnement&lt;/h1&gt;  &lt;p align="justify"&gt;Pour une machine, le fonctionnement est similaire. Il faut partir du principe qu’elle n’a pas encore de cadre de référence et qu’il va falloir qu’elle apprenne pour se constituer une mémoire qui, à son tour, l’aidera à faire un &lt;b&gt;choix&lt;/b&gt; sur une situation avec un contexte particulier. Plus la machine possédera de comportements différents en fonction des contextes, plus elle répondra avec pertinence.&lt;/p&gt;  &lt;p align="justify"&gt;Le temps de réflexion augmentera en fonction du nombre de situations vécues et des comportements effectués ce qui n’est pas toujours amusant. En effet, si l’ordinateur prend trois jours à se décider pour déplacer le cavalier droit aux échecs, l’utilisateur aura déjà fermé le programme.&lt;/p&gt;  &lt;p align="justify"&gt;Quand l’ensemble de tous les comportements devient trop important, il augmente au fil du temps pour affiner la pertinence de l’algorithme. Pour pallier à ce problème complexe, il est nécessaire de séparer les rôles. On va donc créer un modèle qui sera mis à jour par un programme indépendant. Ce modèle simplifie la complexité précédente car il ne s’agrandit pas, il s’ajuste simplement. Vient ensuite, l’algorithme principal qui est de type adaptif et utilise le modèle pour s’auto-améliorer. &lt;/p&gt;  &lt;p align="justify"&gt;Comment est constitué un modèle ? &lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Il est bien souvent composé de probabilités Ainsi, dans le cas d’algorithmes de prédiction, une action donne un état, auquel correspondent plusieurs actions nouvelles possibles. Chaque action possède une probabilité de se produire, associée à l’état courant. Un des modèles régulièrement utilisé est la « chaîne de Markove ».&lt;/p&gt;  &lt;h2&gt;Vous avez dit chaîne de Markov ?&lt;/h2&gt;  &lt;p align="justify"&gt;Une définition simpliste nous suffira pour aborder ici ce modèle : il s’agit de décrire sous forme d’un graphe une série d’états (représentées par des nœuds) et reliées par des probabilités (qui sont les arrêtes). Lorsque nous sommes dans un état, il existe une certaine probabilité pour être dans un deuxième état ou un troisième. A partir de ce constat, nous pouvons écrire une équation prédisant l’état du système dans 5 minutes.&lt;/p&gt;  &lt;p align="justify"&gt;A titre d’illustration, la chaîne de Markov ci-dessous indique que nous avons 9 chances sur 10 de faire l’activité « Autre activité » lorsque nous sommes dans l’état de départ, alors qu’il y a 1 chance sur 10 pour que nous soyons directement amenés à « l’activité de fin ». La somme de toutes les probabilités étant égale à 1. &lt;/p&gt;  &lt;p align="justify"&gt;Pour le cas où nous sommes en train de faire l’autre activité, nous pouvons finir par l’activité de fin (7/10), ou bien recommencer au départ (3/10).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/1781.image_5F00_388419EA.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/7242.image_5F00_thumb_5F00_6C4C103B.png" width="273" height="217" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Un exemple plus détaillé et bien expliqué - enfin je trouve – est disponible sur la page Wikipédia dédiée à la &lt;a href="http://fr.wikipedia.org/wiki/Cha%C3%AEne_de_Markov"&gt;chaîne de Markov&lt;/a&gt;, à savoir Doudou le hamster.&lt;/p&gt;  &lt;p align="justify"&gt;Une autre variante consiste à ajouter un facteur décisionnel à chaque état ; on appelle cela un processus de Markove décisionnel (MDP). On l’utilise pour que l’algorithme ait la capacité de faire un choix. Par la suite, une fois le graphe construit, on peut aisément en déduire des équations transformées en calcules matriciels. Et les matrices, les ordinateurs savent très bien les manipuler ;)&lt;/p&gt;  &lt;p align="justify"&gt;Revenons à nos hamsters. Nous parlions de constitutions de modèle. Il peut aussi se trouver sous forme d’arbre (binaire, quelconque, etc.) ou encore de courbe, pertinent lorsque l’analyse se fonde sur des données temporelles.&lt;/p&gt;  &lt;p align="justify"&gt;Une fois que notre algorithme a appris à apprendre, il fonctionne en autonomie.&lt;/p&gt;  &lt;h2&gt;Apprentissages et élaboration du modèle&lt;/h2&gt;  &lt;p align="justify"&gt;La première phase pour nos algorithmes d’apprentissage automatique doit donc être la classification des données d’apprentissage. Cette phase est un « pré mâchage » de l’information qui sera utilisée pour constituer le modèle. Elle est étiquetée pour être associée à une classe précise. Il existe plusieurs systèmes pour la phase d’apprentissage.&lt;/p&gt;  &lt;h3&gt;Apprentissage supervisé&lt;/h3&gt;  &lt;p align="justify"&gt;Un modèle de classement est soumis par une personne, puis l’information du jeu de données est classée suivant celui-ci. Un &lt;b&gt;expert&lt;/b&gt; est en charge de construire le modèle de classement qui contient des étiquettes (tag) à placer sur la donnée. Le professeur de l’université de Stanford Andrew Ng l’explique dans son &lt;a href="http://www.virtualprofessors.com/machine-learning-stanford-cs-229-andrew-ng"&gt;cours Machine Learning (CS 229)&lt;/a&gt; avec l’exemple suivant (Module 1). &lt;/p&gt;  &lt;p align="justify"&gt;Supposons que nous collections des statistiques sur la taille de maisons au mètre carré et le prix correspondant. Nous avons donc spécifié que, dans notre jeu de données, il y a des maisons avec un attribut « surface » et un autre « prix ». Nous créons le graphique ci-dessous : &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/0724.image_5F00_568227DE.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/5516.image_5F00_thumb_5F00_5C5CCB77.png" width="337" height="203" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Les points bleus correspondent aux maisons, la ligne rouge représente la moyenne. Si nous voulons connaitre le prix pour une maison de surface 80 m², l’algorithme va en déduire grâce au jeu de données que le prix sera de l’ordre de 115 000 €. (Vous l’aurez deviné, ces prix de l’immobilier ne correspondent pas à ceux pratiqués sur Paris…)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/6180.image_5F00_493B9ECB.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/5428.image_5F00_thumb_5F00_2128EFAC.png" width="337" height="203" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Il est possible de définir plus de deux critères (la surface et le prix) ; ce qui conduit à faire évoluer le graphique ci-dessus vers un graphique multidimensionnel. Le graphique ci-dessus modélise un problème connu sous le nom de &lt;b&gt;problème de régression&lt;/b&gt; (faisant référence au &lt;a href="http://fr.wikipedia.org/wiki/R%C3%A9gression_lin%C3%A9aire"&gt;modèle de régression linéaire&lt;/a&gt; en statistique).&lt;/p&gt;  &lt;h3&gt;Apprentissage non-supervisé &lt;/h3&gt;  &lt;p align="justify"&gt;Comme son nom l’indique, il est l’opposé du premier. Dans le premier, l’apprentissage s’effectue de manière subjective c’est-à-dire qu’une personne décrit au préalable quels critères existent dans son jeu de données à analyser et classer. Dans cet apprentissage ci, l’algorithme ne possède pas d’étiquette : il est autodidacte. Il va procéder par regroupement en cherchant les données similaires. Il est très intéressant d’utiliser cette technique lorsque vous ne savez pas ce que vous cherchez. Typiquement quand vous voulez faire éclore quelque chose qui ne vous viendrait pas à l’esprit. Ce type d’apprentissage est aussi appelé « clustering », qui signifie « groupement ».&lt;/p&gt;  &lt;p align="justify"&gt;Pour l’exemple, on l’utilise dans un traitement d’image particulier, qui sélectionne les pixels similaires et en déduit qu’ils sont liés à un objet précis. Une reconstitution 3D à partir d’une photo peut être réalisée ensuite par ce biais (on appelle ce domaine la « Computer Vision »).&lt;/p&gt;  &lt;p align="justify"&gt;Dans l’illustration ci-dessous, un algorithme de clustering a permis de regrouper les pixels par région et d’en séparer les différents composants. D’autres algorithmes sont ensuite utilisés pour recréer une projection en trois dimensions. &lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/4035.image_5F00_1FE456CD.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/1830.image_5F00_thumb_5F00_3DD23EF4.png" width="372" height="340" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Une des bibliothèques couramment utilisée dans ce domaine (à savoir le computer vision) est &lt;a href="http://opencv.org/"&gt;OPenCV&lt;/a&gt; (Open Source Computer Vision) disponible sur la forge GitHub. (Un tutoriel est disponible &lt;a href="http://karanjthakkar.wordpress.com/2012/11/21/usin-opencv-2-4-2-with-visual-studio-2012-on-windows-7-64-bit/"&gt;ici&lt;/a&gt; pour une utilisation avec Visual Studio 2012).&lt;/p&gt;  &lt;h3&gt;Apprentissage par renforcement&lt;/h3&gt;  &lt;p align="justify"&gt;Dans le cas présent, l’algorithme apprend de l’environnement dans lequel il évolue. Ce type d’apprentissage tente de concevoir une &lt;b&gt;stratégie&lt;/b&gt; la plus optimisée possible. Le système fonctionne avec des récompenses que renvoie l’environnement à celui-ci. Ces récompenses peuvent être encourageantes, ou punitives. &lt;/p&gt;  &lt;p align="justify"&gt;Un autre exemple que donne le professeur Andrew Ng dans son &lt;a href="http://www.virtualprofessors.com/machine-learning-stanford-cs-229-andrew-ng"&gt;cours Machine Learning (CS 229)&lt;/a&gt; est le dressage d’un chien. Lorsque notre chien est en phase de dressage, nous allons lui apprendre ce que nous voulons de lui quand nous lui disons « couché ! ». S’il ne le fait pas correctement, on lui dit « mauvais chien », s’il le fait correctement c’est un « bon chien ». ;) &lt;/p&gt;  &lt;p align="justify"&gt;Le principe de fonctionnement pour l’algorithme de type renforcement est le même que pour le chien. Il va donc s’améliorer au fur et à mesure que l’environnement lui donne des récompenses.&lt;/p&gt;  &lt;h1&gt;Domaines d’application&lt;/h1&gt;  &lt;p align="justify"&gt;L’apprentissage automatique est très utilisé, beaucoup plus qu’on ne le croit de prime abord : &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Par exemple avec l’utilisation de notre mobile favori pour taper du texte, les suggestions de mots sont produites par des algorithmes utilisant principalement des chaines de Markov avec un graphe de type &lt;a href="http://fr.wikipedia.org/wiki/N-gramme"&gt;N-Gramme&lt;/a&gt;. &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;La reconnaissance manuscrite utilise un algorithme de reconnaissance de forme et un processus Markovien pour la reconnaissance de langage naturel. Les deux algorithmes combinés contribuent à améliorent fortement les performances et l’efficacité.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;La reconnaissance vocale, en particulier l’isolation de la voix par rapport à un environnement bruyant, utilise un algorithme d’apprentissage non-supervisé constitué de &lt;a href="http://fr.wikipedia.org/wiki/R%C3%A9seau_de_neurones"&gt;réseaux neuronaux&lt;/a&gt; (un modèle conçu à la manière d’un cerveau humain).&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Ce ne n’est qu’un rapide aperçu de ce qui existe déjà grâce au domaine de l’apprentissage automatique. Toutes ces fonctions se trouvent maintenant dans nos téléphones intelligents (smartphone). &lt;/p&gt;  &lt;p align="justify"&gt;Mais aujourd’hui, avec des architectures de type Big Data, un nouvel horizon s’ouvre au « Machine Learning » comme cela a été évoqué lors de l’édition 2013 des Microsoft TechDays : &lt;a href="http://www.microsoft.com/france/mstechdays/programmes/2013/fiche-session.aspx?ID=86180f9d-8abf-4fa4-881a-eced31e2a30e"&gt;Bienvenue dans l'océan numérique (KEY203)&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Le « Machine Learning » constitue donc une vraie &lt;b&gt;révolution dans le logiciel&lt;/b&gt; : probabilités et statistiques sur les masses de données&amp;#160; permettent au logiciel « d’apprendre » et non seulement calculer. Nouvelle frontière, nouvelle façon de penser le logiciel et de le programmer, c’est une révolution qui replace la « Big Science » au cœur de l’innovation. Nous aurons très prochainement l’occasion de revenir sur la conférence &lt;a href="http://research.microsoft.com/en-us/um/cambridge/events/mls2013/default.aspx"&gt;Microsoft Research Machine Learning Summit&lt;/a&gt; .&lt;/p&gt;  &lt;h1&gt;Big Data et « Machine Learning »&lt;/h1&gt;  &lt;p align="justify"&gt;Avec l’arrivée de Hadoop, nous l’avons vu à l’occasion de précédents billets, fidèles lectrices et lecteurs de ce blog, un écosystème de Frameworks en sus s’est rapidement constitué. Et donc &lt;u&gt;rapidement&lt;/u&gt;, l’apprentissage automatique a fait son apparition dans cet écosystème comme la puissance offerte par Hadoop crée une opportunité au domaine sans précédent.&lt;/p&gt;  &lt;p align="justify"&gt;En effet, les algorithmes de « Machine Learning » et d’intelligence artificielle en général sont bien souvent très gourmands en ressources de calcul et prennent dès lors beaucoup de temps à s’exécuter. Néanmoins des optimisations sont régulièrement apportées sur ces algorithmes, mais elles sacrifient la précision contre le temps.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://mahout.apache.org/"&gt;Apache Mahout&lt;/a&gt; est la réponse à la question (celle que vous vous êtes posée intérieurement). C’est un projet Apache, comme Hadoop, à ceci près qu’il n’est pas encore en version finale. Le projet consiste en un entrepôt d’algorithmes d’apprentissage automatique, tous portés afin de s’exécuter sur Map/Reduce. Une vingtaine d’algorithmes sont déjà portés sur le paradigme ; ce qui suffit pour la très grande majorité des problèmes.&lt;/p&gt;  &lt;p align="justify"&gt;En voici quelques-uns.&lt;/p&gt;  &lt;p align="justify"&gt;Pour ce qui est du contexte d’apprentissage supervisé : &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;b&gt;Régression logistique (SGV)&lt;/b&gt;. Son domaine de prédilection est celui de la prédiction de probabilité d’apparition d’évènements comme par exemple dans le domaine de la fraude bancaire ou encore dans celui de la publicité pour le ciblage de clients fidélisables.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;b&gt;Classification Bayésienne&lt;/b&gt;. Une utilisation courante de notre boîte aux lettres électronique nous amène à utiliser un programme basé sur cet algorithme. Les filtres de spam sont en fait des règles de classification qui servent à l’algorithme bayésien contenu dans l’agent anti-spam pour séparer les « bons courriels des mauvais ».&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;b&gt;Machine à vecteurs de support (SVM)&lt;/b&gt;. Il s’agit d’un ensemble de techniques destinées à résoudre des problèmes de discrimination (prédiction d’appartenance à des groupes prédéfinis)&lt;sup&gt; &lt;/sup&gt;et de régression (analyse de la relation d’une variable par rapport à d’autres).&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;b&gt;Réseau neuronaux&lt;/b&gt;. A l’inverse des algorithmes de déduction, ce dernier est un algorithme de type induction c’est-à-dire que, par le biais d’observations limitées, il essaie de tirer des généralisations plausibles. C’est un système basé sur l’expérience : il se constitue une mémoire lors de sa phase d’apprentissage (qui peut être aussi non-supervisée) que l’on appelle entrainement. &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;b&gt;Forêts d’arbres décisionnels (Random Forest)&lt;/b&gt;. C’est une application de graphe en arbres de décision permettant ainsi la modélisation de chaque résultat sur une branche en fonction de choix précédents. On prend ensuite la meilleure décision en fonction des résultats qui suivront. On peut considérer cela comme une forme d’anticipation.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;b&gt;Le Boosting&lt;/b&gt;. Il s’agit d’une méthode de classification émettant des hypothèses qui sont au départ de moindre importance. Plus une hypothèse est vérifiée, et plus son indice de confiance augmente et donc elle prend plus d’importance dans la classification.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Et pour le contexte d’apprentissage non-supervisé : &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;b&gt;K-moyennes (KMeans)&lt;/b&gt;. KMeans est un algorithme de partitionnement des données en K nombre de groupes. Il est utilisé notamment dans la bibliothèque OpenCV précédemment mentionnée vis-à-vis du domaine de la « computer vision ». Dans Mahout, on l’utilise typiquement afin de déterminer quelle suggestion peut être faite à un utilisateur en fonction des préférences que d’autres utilisateurs similaires ont eues (utilisateurs du même groupe).&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;b&gt;Fuzzy KMeans&lt;/b&gt;. Il s’agit d’une variante du précédent algorithme proposant qu’un objet ne soit associé qu’à un seul groupe.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;b&gt;Espérance-Maximisation (EM)&lt;/b&gt;. Comme on peut le deviner, cet algorithme utilise des probabilités pour décrire qu’un objet appartient à un groupe. Le centre du groupe est ensuite recalculé par rapport à la moyenne des probabilités de chaque objet du groupe.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;b&gt;Regroupement hiérarchique&lt;/b&gt;. Deux sous-algorithmes en découlent, à savoir d’une part le « bottom up » qui a pour fonction d’agglomérer des groupes similaires, donc en réduire le nombre (plus lisible) et d’en proposer un ordre hiérarchique, et d’autre part, le « top down » qui fait le résonnement inverse en divisant le premier groupe récursivement en sous-ensembles.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Nous présentons ici les principaux algorithmes rapidement dans la mesure où ce billet a simplement vocation à introduire le sujet. Nous aurons l’occasion d’y revenir à l’occasion de prochains billet. Ceci étant, dans l’intervalle, rien ne vous empêche d’aller plus loin dans vos recherches. Nous ne serions d’ailleurs que vous encourager à le faire. Il est en effet nécessaire de regarder dans le détail les algorithmes proposés par Mahout ainsi que leurs implémentations, et ce, afin d’utiliser au mieux ceux-ci dans votre application.&lt;/p&gt;  &lt;h1&gt;Pour aller plus loin&lt;/h1&gt;  &lt;p align="justify"&gt;Nous espérons vous avoir intéressé avec cette introduction qui touche un large panel de domaines scientifiques ou d’autres domaines d’ailleurs. Comme nous l’avons suggéré, nous prévoyons un prochain billet sur l’application d’un algorithme de « Machine Learning », Soyez patient. &lt;/p&gt;  &lt;p align="justify"&gt;En attendant voici quelques ressources. Pour commencer, mentionnons le &lt;a href="http://mahout.apache.org/"&gt;site officiel&lt;/a&gt; du projet Mahout sur lequel vous trouverez la &lt;a href="https://cwiki.apache.org/confluence/display/MAHOUT/Algorithms"&gt;liste complète&lt;/a&gt; des algorithmes proposés aujourd’hui dans ce contexte.&lt;/p&gt;  &lt;p align="justify"&gt;Vous pouvez aussi suivre le &lt;a href="http://www.virtualprofessors.com/machine-learning-stanford-cs-229-andrew-ng"&gt;cours Machine Learning (CS 229)&lt;/a&gt; du professeur Andrew Ng de l’université de Stanford (le premier module du cours commence réellement à la 32&lt;sup&gt;ème&lt;/sup&gt; minute).&lt;/p&gt;  &lt;p align="justify"&gt;Pour les plus impatients, Microsoft Research a élaboré un prototype (les données d’entrainements et les sources se trouvent sur &lt;a href="http://labrosa.ee.columbia.edu/millionsong/"&gt;GitHub&lt;/a&gt;) d’application basé sur le &lt;a href="http://labrosa.ee.columbia.edu/millionsong/"&gt;jeu de données 1 million song&lt;/a&gt; réunissant les musiques préférées d’un million d’utilisateurs. Vous retrouvez les travaux, projets et publications de Microsoft Research sur le « Machine Learning » &lt;a href="http://research.microsoft.com/en-us/about/our-research/machine-learning.aspx"&gt;ici&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Enfin, comme un certain nombre de billets ont été récemment consacrés à HDInsight, nous vous invitons à consulter le &lt;a href="http://www.windowsazure.com/en-us/manage/services/hdinsight/recommendation-engine-using-mahout/?fb=fr-fr"&gt;tutoriel&lt;/a&gt; de l’équipe HDInsight qui propose de créer un moteur de recommandations avec Mahout et le jeu de données 1 million song précédent.&lt;/p&gt;  &lt;p align="justify"&gt;S’agit-il de bonnes recommandations ? Vous nous le direz ;)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10413589" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Big+Data/">Big Data</category><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Mahout/">Mahout</category><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Machine+Learning/">Machine Learning</category></item><item><title>Bienvenue dans la version préliminaire de Windows Azure HDInsight</title><link>http://blogs.msdn.com/b/big_data_france/archive/2013/03/26/bienvenue-dans-la-version-pr-233-liminaire-de-windows-azure-hdinsight.aspx</link><pubDate>Tue, 26 Mar 2013 09:57:29 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10405359</guid><dc:creator>Philippe Beraud - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/big_data_france/rsscomments.aspx?WeblogPostID=10405359</wfw:commentRss><comments>http://blogs.msdn.com/b/big_data_france/archive/2013/03/26/bienvenue-dans-la-version-pr-233-liminaire-de-windows-azure-hdinsight.aspx#comments</comments><description>&lt;p align="justify"&gt;Ce billet est co-publié avec Benjamin Guinebertière qui consacre également ce mois-ci un &lt;a href="http://blogs.msdn.com/b/windowsazurefrance/archive/2013/03/21/tuto-hadoop-arrive-dans-le-portail-windows-azure-lan-231-ons-des-jobs-java-pig-et-hive-pour-voir.aspx"&gt;billet&lt;/a&gt; à Windows Azure HDInsight sur le blog MSDN Windows Azure France suite à la disponibilité de ce service en version préliminaire (Public Preview) sur le &lt;a href="https://manage.windowsazure.com/"&gt;portail de gestion de Windows Azure&lt;/a&gt;. Nos deux billets sont complémentaires :)&lt;/p&gt;  &lt;p align="justify"&gt;Windows Azure HDInsight se veut avec les facultés propres à l’environnement Windows Azure le moyen le plus simple de déployer, de gérer et faire passer à l’échelle des solutions basées sur Hadoop. &lt;/p&gt;  &lt;h1&gt;Une première vue d’ensemble&lt;/h1&gt;  &lt;p align="justify"&gt;Fidèles lectrices ou lecteurs de ce blog, comme vous le savez, Windows Azure HDInsight a été développé en &lt;a href="http://hortonworks.com/partners/microsoft/"&gt;partenariat&lt;/a&gt; avec le développeur logiciel et distributeur Hadoop &lt;a href="http://hortonworks.com/"&gt;Hortonworks&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Il s’appuie sur &lt;a href="http://hortonworks.com/products/hortonworksdataplatform/"&gt;Hortonworks Data Platform (HDP) 1.1.0&lt;/a&gt; pour mettre à disposition les services Hadoop dans le nuage, et en particulier : &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;a href="http://hadoop.apache.org/"&gt;Apache Hadoop&lt;/a&gt; (en version 1.0.3),&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;a href="http://hive.apache.org/"&gt;Apache Hive&lt;/a&gt; (en version 0.9.0),&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;a href="http://pig.apache.org/"&gt;Apache Pig&lt;/a&gt; (en version 0.9.3),&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;a href="http://sqoop.apache.org/"&gt;Apache Sqoop&lt;/a&gt; (en version 1.4.3),&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;a href="http://oozie.apache.org/"&gt;Apache Oozie&lt;/a&gt; (en version 3.2.0), &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;a href="http://incubator.apache.org/hcatalog/"&gt;Apache HCatalog&lt;/a&gt; (en version 0.4.1), &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;a href="http://people.apache.org/~thejas/templeton_doc_latest/index.html"&gt;Apache Templeton&lt;/a&gt; (également référencé sous l’appellation WebHCat)) (en version 0.1.4).&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Vous pouvez consulter l’article &lt;a href="http://www.windowsazure.com/en-us/manage/services/hdinsight/howto-hadoop-version/?fb=fr-fr"&gt;What version of Hadoop is in Windows Azure HDInsight?&lt;/a&gt; pour plus de détails.&lt;/p&gt;  &lt;p align="justify"&gt;Tous ces services et outils fonctionnent « en l'état » comme attendu ; cela signifie que les investissements et les connaissances dans l'un de ces services et outils sont directement opérationnels sous HDInsight et ce tels quels. En outre, d'autres projets dans l'écosystème Hadoop tels que &lt;a href="http://mahout.apache.org/"&gt;Mahout&lt;/a&gt; (Cf. &lt;a href="https://github.com/wenming/BigDataSamples/tree/master/mahout"&gt;cet exemple&lt;/a&gt;) peuvent facilement être utilisés au-dessus d’HDInsight. &lt;/p&gt;  &lt;p align="justify"&gt;Au-delà de ces composantes, Windows Azure HDInsight apporte un ensemble d’éléments additionnels comme :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Des mises à jour Hadoop qui assurent les dernières versions stables de HDFS (Hadoop Distributed File System) et Map/Reduce, Pig, Hive, Sqoop, etc. ;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Windows Azure Vault (ASV) comme système de fichier par défaut. (HDFS est toujours disponible) ;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Un pilote HIVE ODBC;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Un &lt;a href="http://hadoopsdk.codeplex.com/"&gt;SDK&lt;/a&gt; pour écrire des « jobs » Hadoop en utilisant le Framework .NET et l’IDE Visual Studio ;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Etc.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Nous reviendrons sur ces apports dans la suite de ce billet.&lt;/p&gt;  &lt;p align="justify"&gt;Comme indiqué dans le billet &lt;a href="http://blogs.technet.com/b/dataplatforminsider/archive/2013/03/18/gartner-bi-summit-2013-bringing-hadoop-to-the-enterprise.aspx"&gt;Gartner BI Summit 2013: Bringing Hadoop to the Enterprise&lt;/a&gt; et &lt;a href="http://hortonworks.com/blog/hadoop-in-windows/"&gt;reporté également par Hortonworks&lt;/a&gt;, &lt;a href="http://svn.apache.org/viewvc?view=revision&amp;amp;revision=1453486"&gt;la communauté Hadoop a voté&lt;/a&gt; pour passer Hadoop sur Windows dans le tronc principal (main trunc) d'Apache Hadoop. Les équipes d'ingénieurs de Microsoft et d’Hortonworks en collaboration avec la communauté Hadoop ont proposé un certain nombre d'&lt;a href="https://issues.apache.org/jira/browse/HADOOP-8079"&gt;améliorations vis-à-vis des environnements de développement et d’exécution d’Hadoop sur Windows Azure (et Windows Server)&lt;/a&gt;, améliorations qui sont fusionnées dans le tronc Apache. Toutes ces améliorations sont également incorporées dans Windows Azure HDInsight (et &lt;a href="http://www.microsoft.com/web/gallery/install.aspx?appid=HDINSIGHT-PREVIEW"&gt;HDInsight Server&lt;/a&gt; ainsi d’HDP pour Windows d’Hortonworks).&lt;/p&gt;  &lt;p align="justify"&gt;Le déplacement d’Hadoop sur Windows pour le tronc principal Apache Hadoop et l’investissement continu de Microsoft dans le projet Hadoop sont autant d’éléments qui contribuent à assurer que le choix d’HDInsight par les clients peut se faire en toute confiance, en sachant qu'HDInsight est 100% compatible avec Apache Hadoop, aujourd’hui et dans l'avenir.&lt;/p&gt;  &lt;p align="justify"&gt;HDInsight simplifie également Hadoop en permettant aux clients de déployer des clusters en quelques minutes au lieu de plusieurs heures ou jours. Ces clusters sont dimensionnés avec le nombre de nœuds voulus et s'intègrent avec des outils et des APIs Web simples de façon à assurer que les clients puissent facilement déployer, surveiller et arrêter leur cluster dans le Cloud. En outre, Windows Azure HDInsight s'intègre aux outils de BI (Business Intelligence) de Microsoft, pour permettre aux clients de facilement analyser et interpréter leurs données et recueillir ainsi des informations précieuses pour leur organisation. La présence, par exemple d’un pilote HIVE ODBC permet de coupler Excel avec une source de données HDFS ! Vous êtes ensuite dans Excel que vous connaissez avec ses tableaux croisés dynamiques, ses formules, etc. il convient aussi de citer l’extension Data Explorer à laquelle nous consacrerons prochainement un billet. Vous pouvez vous faire une première idée avec le billet &lt;a href="http://blogs.msdn.com/b/dataexplorer/archive/2013/03/18/mashups-and-visualizations-over-big-data-and-azure-hdinsight-using-data-explorer.aspx"&gt;Mashups and visualizations over Big Data and Azure HDInsight using Data Explorer&lt;/a&gt;.&lt;/p&gt;  &lt;h1&gt;Bien commencer avec Windows Azure HDInsight&lt;/h1&gt;  &lt;p align="justify"&gt;Si vous disposez d’un compte Windows Azure – si tel n’est pas d’ores et déjà le cas, vous allez pouvoir y remédier dans la suite de ce billet - vous pouvez &lt;a href="http://go.microsoft.com/fwlink/?LinkID=286685"&gt;demander un accès&lt;/a&gt; à la version préliminaire publique d’HDInsight et créer alors un cluster HDInsight au sein du portail de gestion de Windows Azure. &lt;/p&gt;  &lt;p align="justify"&gt;La version préliminaire publique de Windows Azure HDInsight est un programme destiné à ce que tout un chacun puisse tester et se familiariser avec le service. Avec cette bêta publique, vous pouvez désormais avoir accès à un cluster qui, contrairement à celui que vous avez pu expérimenter avec &lt;a href="http://www.hadooponazure.com/"&gt;Windows Azure HDInsight Service Preview&lt;/a&gt; :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;N’expire pas tant qu’on ne le supprime pas explicitement (vs. 5 jours),&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Peut avoir jusqu’à 40 nœuds de calcul (data node) (vs. 3 nœuds) de 4 cœurs (vs 2. cœurs).&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Ce cluster dispose toujours d’un nœud principal (head node) de 8 cœurs.&lt;/p&gt;  &lt;p align="justify"&gt;Comme vous le verrez, l’un des avantages du service réside dans le fait, que via le portail, les données qui doivent être analysées par le cluster ainsi constitué à la demande peuvent provenir soit du cluster lui-même (comme vous pouvez vous y attendre), soit d’ailleurs, comme par exemple, d’un autre compte Windows Azure (si vous en avez des données sur des « blob storages » Windows Azure) ou bien être le résultat d’un transfert sur le cluster par FTP. Le service s’occupe ensuite de placer vos données pour que ces dernières puissent être prises en compte par le cluster.&lt;/p&gt;  &lt;p align="justify"&gt;La version préliminaire publique permet à l’équipe de développement de collecter vos retours utilisateurs et d’isoler et corriger des bogues non encore identifiées. En retour, Microsoft propose un rabais de 50% sur le coût des machines virtuelles (instances de worker roles) sous-jacentes pour cette période préliminaire. &lt;/p&gt;  &lt;p align="justify"&gt;Il est temps à présent de créer votre cluster.&lt;/p&gt;  &lt;h2&gt;Obtenir un passe pour accéder à la version préliminaire&lt;/h2&gt;  &lt;p align="justify"&gt;De façon à accéder à la version préliminaire publique de Windows Azure HDInsight depuis le portail de gestion Windows Azure, il est avant toute chose nécessaire de disposer d’un compte Windows Azure.&lt;/p&gt;  &lt;p align="justify"&gt;Si tel n’est pas le cas, deux solutions s’offrent à vous si vous ne disposez pas d’ores et déjà d’un compte Windows Azure: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Vous avez la possibilité de souscrire à un compte payant, à vous ensuite de gérer votre abonnement et les frais associés. Plus d’informations sur le sujet, vous pouvez consulter les &lt;a href="http://www.windowsazure.com/fr-fr/pricing/details"&gt;détails de la facturation&lt;/a&gt;;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Vous pouvez créer un compte de test en profitant de &lt;a href="http://www.windowsazure.com/en-us/pricing/free-trial/?WT.mc_id=AEA18664C"&gt;l’offre 90 jours&lt;/a&gt;. Attention cependant, le déploiement de Windows Azure HDInsight sur cette offre peut conduire à consommer les ressources incluses assez rapidement. Plus d’informations sur le sujet, vous pouvez consulter le détail de la facturation à la section &lt;a href="http://www.windowsazure.com/fr-fr/pricing/details"&gt;HDInsight (version préliminaire)&lt;/a&gt;. Le billet &lt;a href="http://blogs.msdn.com/b/windowsazurefrance/archive/2012/08/29/tuto-comment-souscrire-gratuitement-224-windows-azure.aspx"&gt;[TUTO] : Comment souscrire gratuitement à Windows Azure ?&lt;/a&gt; sur le blog MSDN Windows Azure France propose un pas à pas détaillé pour la création d’un compte de test. Vous pouvez le consulter à cet effet si besoin pour une vue d’ensemble.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Avant de commencer, vous pouvez vérifier si votre compte a déjà accès à la fonctionnalité HDInsight en cliquant sur &lt;b&gt;NOUVEAU&lt;/b&gt; en bas à gauche dans le &lt;a href="https://manage.windowsazure.com/"&gt;portail de gestion Windows Azure&lt;/a&gt; (&lt;a href="https://manage.windowsazure.com"&gt;https://manage.windowsazure.com&lt;/a&gt;). &lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/0743.image_5F00_0246732D.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/7776.image_5F00_thumb_5F00_23596FC7.png" width="582" height="240" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Si la fonctionnalité est marquée comme non disponible, il est nécessaire de vous inscrire à la fonctionnalité : &lt;/p&gt;  &lt;p align="justify"&gt;Cliquez sur &lt;b&gt;preview program&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/2806.image_5F00_0D235475.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/5040.image_5F00_thumb_5F00_0BDEBB96.png" width="472" height="204" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Cliquez sur &lt;b&gt;try it now&lt;/b&gt; dans la section «&lt;b&gt;Azure HDInsight Preview&lt;/b&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Sélectionnez votre type d’abonnement Windows Azure (ici une évaluation gratuite de 3 mois). &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/6114.image_5F00_0A9A22B7.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/4628.image_5F00_thumb_5F00_498BA352.png" width="303" height="228" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Validez la demande. Après cela, il convient d’attendre un courriel d’acceptation de votre « candidature ». Attention toutefois ce courriel peut mettre un certain temps à venir (pour ma part j’ai attendu 4 jours). Les demandes sont validées généralement le mercredi et le week-end donc prenez votre mal en patience ;)&lt;/p&gt;  &lt;p align="justify"&gt;Une fois le courriel reçu, connectez vous à votre compte Azure et rendez-vous sur le &lt;a href="https://manage.windowsazure.com/"&gt;portail de gestion de Windows Azure&lt;/a&gt; pour créer votre premier cluster. Voyons comment cela se traduit dans la pratique.&lt;/p&gt;  &lt;h2&gt;Créer un compte de stockage&lt;/h2&gt;  &lt;p align="justify"&gt;Rendez-vous sur le &lt;a href="https://manage.windowsazure.com/"&gt;portail de gestion de Windows Azure&lt;/a&gt; pour créer votre premier cluster.&lt;/p&gt;  &lt;p align="justify"&gt;Un compte de stockage est nécessaire à la création d’un cluster HDInsight car c’est l’un des systèmes de stockage de données disponibles comme abordé précédemment, l’autre étant bien sûr HDFS. HDInsight appelle ce système de fichier ASV (Azure Storage Vault).&lt;/p&gt;  &lt;p align="justify"&gt;Pourquoi deux systèmes de fichiers ? Commençons par le plus connu dans le monde Hadoop. HDFS permet d’exécuter des programmes Map/Reduce conçus pour Hadoop d’une façon générale (et ce indépendamment de la plateforme Azure). Dans la pratique, les données sur HDFS sont stockées sur des disques locaux des nœuds de calcul (data node).&lt;/p&gt;  &lt;p align="justify"&gt;ASV permet aussi d’exécuter des programmes Map/Reduce, mais cette fois sur des données stockées dans le compte de stockage précédent dans des « blobs » Windows Azure. Les performances sont équivalentes; elles peuvent d’ailleurs être meilleures avec ASV. Cela contourne notamment la nécessité de charger des données sur le système HDFS au préalable du traitement.&lt;/p&gt;  &lt;p align="justify"&gt;Au final, la principale différence réside essentiellement dans le fait que les données dans ASV survivent à l’arrêt du cluster HDInsight ; ce qui n’est pas le cas des données HDFS (puisqu’elles sont sur les disques des machines virtuelles (VM) que l’on supprime en arrêtant le cluster). Par ailleurs, certains projets comme l’&lt;a href="http://www.microsoft.com/en-us/download/details.aspx?id=36803"&gt;extension Data Explorer pour Excel&lt;/a&gt; - dont nous aurons l’occasion de reparler prochainement - utilisent le système ASV pour récupérer des résultats d’analyses faites sur HDInsight. Nous aurons l’occasion de parler du Data Explorer dans un prochain billet.&lt;/p&gt;  &lt;p align="justify"&gt;Pour revenir à ce compte de stockage pour ASV, il est nécessaire de le créer aujourd’hui dans le centre de données de l’Est des Etats-Unis, comme la version préliminaire publique est disponible uniquement dans ce centre de données pour l’instant. &lt;/p&gt;  &lt;p align="justify"&gt;Pour cela, cliquez sur &lt;b&gt;NOUVEAU&lt;/b&gt; et sélectionnez &lt;b&gt;SERVICES DE DONNEES&lt;/b&gt;, &lt;b&gt;STOCKAGE&lt;/b&gt;, et &lt;b&gt;CREATION RAPIDE&lt;/b&gt;.&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/7762.image_5F00_76345D2B.png"&gt;&lt;img title="image" style="border: 0px currentcolor; display: inline; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/0815.image_5F00_thumb_5F00_5BF3F407.png" width="480" height="264" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Précisez un nom (« donnee2 » dans l’illustration précédente) et cliquez sur &lt;b&gt;CREER UN COMPTE DE STOCKAGE&lt;/b&gt; pour valider.&lt;/p&gt;  &lt;h2&gt;Créer un cluster HDInsight&lt;/h2&gt;  &lt;p align="justify"&gt;Passons à la création du cluster en tant que telle. Celle-ci s’effectue comme suit. Cliquez sur l’icône &lt;b&gt;HDINSIGHT&lt;/b&gt; sur la partie gauche du portail.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/5773.image_5F00_5AAF5B28.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/6278.image_5F00_thumb_5F00_596AC249.png" width="473" height="231" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Cliquez sur &lt;b&gt;NOUVEAU&lt;/b&gt; puis sélectionnez &lt;b&gt;SERVICES DE DONNEES&lt;/b&gt;, &lt;b&gt;HDINSIGHT&lt;/b&gt;, et &lt;b&gt;QUICK CREATE&lt;/b&gt;.&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/3146.image_5F00_5826296A.png"&gt;&lt;img title="image" style="margin: 0px; border: 0px currentcolor; display: inline; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/8420.image_5F00_thumb_5F00_28F43DD3.png" width="523" height="233" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Vous devez préciser un nom pour votre cluster (&lt;b&gt;CLUSTER NAME&lt;/b&gt;). Vous devez sélectionner une taille (&lt;b&gt;CLUSTER SIZE&lt;/b&gt;) ; La valeur par défaut est 4 (nœuds de calcul) mais 8, 16 et 32 sont aussi disponibles. (Pour choisir plus finement le nombre de nœuds, il faut choisir &lt;b&gt;CUSTOM CREATE&lt;/b&gt; au lieu de &lt;b&gt;QUICK CREATE&lt;/b&gt;). &lt;/p&gt;  &lt;p align="justify"&gt;Il convient de noter noter que seulement la version 4 sera gratuite. Il est enfin nécessaire de préciser un mot de passe (&lt;b&gt;PASSWORD&lt;/b&gt;) pour le cluster. (Le nom d’utilisateur par défaut est par défaut est &lt;b&gt;admin&lt;/b&gt;.) Ces informations d’identification vous seront demandées pour accéder au portail Web. &lt;/p&gt;  &lt;p align="justify"&gt;Vous devez enfin sélectionner le compte de stockage précédemment créé (&lt;b&gt;STORAGE ACCOUNT&lt;/b&gt;).&lt;/p&gt;  &lt;p align="justify"&gt;Cliquez sur &lt;b&gt;CREATE HDINSIGHT CLUSTER &lt;/b&gt;pour valider. Ceci déclenche la création du cluster ; ce qui nécessite quelques minutes. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/5280.image_5F00_403F4244.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/6170.image_5F00_thumb_5F00_6D542F12.png" width="474" height="68" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Une fois le cluster prêt, une notification s’affiche dans la barre du bas. De plus, le statut du cluster passe à &lt;b&gt;Running&lt;/b&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/8311.image_5F00_0577996E.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/0407.image_5F00_thumb_5F00_72566CC1.png" width="546" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Découvrir le cluster&lt;/h2&gt;  &lt;p align="justify"&gt;Toujours depuis le portail de gestion Windows Azure, dans la rubrique HDInsight, vous pouvez voir le cluster activé, en cours d’utilisation. &lt;/p&gt;  &lt;p align="justify"&gt;Pour accéder au &lt;b&gt;Dashboard&lt;/b&gt; de votre cluster et commencer à l’utilisation. Cliquez simplement dessus. &lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/1462.image_5F00_3147ED5D.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/6254.image_5F00_thumb_5F00_70396DF8.png" width="224" height="310" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Une fois dans la page &lt;b&gt;DASHBOARD&lt;/b&gt;, cliquez sur le lien présent dans la section &lt;b&gt;Go To Cluster&lt;/b&gt; ou bien sur &lt;b&gt;MANAGE&lt;/b&gt; dans la barre du bas.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/8814.image_5F00_2F2AEE94.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/6735.image_5F00_thumb_5F00_4ED9C85C.png" width="542" height="27" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Une nouvelle page d’authentification apparaît, précisez avec vos informations d’authentification spécifiées lors de la création du cluster (« admin » et votre mot de passe). &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/4101.image_5F00_59971FB1.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/1464.image_5F00_thumb_5F00_7945F979.png" width="152" height="121" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Vous accédez alors au portail de votre cluster, ici elephantjaune.azurehdinsight.net.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/3527.image_5F00_18F4D342.png"&gt;&lt;img title="image" style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/5661.image_5F00_thumb_5F00_2CA1BCD6.png" width="465" height="398" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Le portail comporte deux sections principales groupant différents liens (représentés par icones).&lt;/p&gt;  &lt;p align="justify"&gt;Une première section &lt;b&gt;Your Cluster&lt;/b&gt; vous permet par le biais de plusieurs méthodes d’interagir et de gérer votre cluster : &lt;b&gt;Interactive Console &lt;/b&gt;pour une console pour JavaScript et pour Hive, &lt;b&gt;Remote Desktop &lt;/b&gt; pour un accès distant direct au cluster, &lt;b&gt;Job History&lt;/b&gt; pour l’historique des « jobs » lancés, &lt;b&gt;Samples &lt;/b&gt;pour des exemples&lt;b&gt; &lt;/b&gt;« clef-en-main » et prêts à s’exécuter sur Windows Azure HDInsight à l’image du pilote ODBC et l’extension Hive pour Excel) etc.&lt;/p&gt;  &lt;p align="justify"&gt;Il convient d’apporter une petite précision sur &lt;b&gt;Remote Desktop&lt;/b&gt; : celui-ci vous amènera sur le nœud principal (head node) du cluster Hadoop. C’est sur celui-ci que sont installés les différents modules complémentaires et que vous pouvez utiliser (via ligne de commande) Hadoop.&lt;/p&gt;  &lt;p align="justify"&gt;La seconde section intitulée &lt;b&gt;Your Tasks &lt;/b&gt;vous permet de créer des nouveaux « jobs » et de tracer ceux que vous avez déjà créés ou lancés pour cette session.&lt;/p&gt;  &lt;p align="justify"&gt;Il est temps de s’intéresser à la programmation et aux possibilités apportées par Windows Azure HDInsight en la matière.&lt;/p&gt;  &lt;h1&gt;Créer des « jobs » avec Windows Azure HDInsight&lt;/h1&gt;  &lt;p align="justify"&gt;Comme indiqué en introduction de ce billet, Windows Azure HDInsight s’appuie sur HDP 1.1.0 et propose de fait un degré élevé de fidélité avec l’écosystème Hadoop. En tant que telles, de nombreuses capacités « en l'état » comme attendu.&lt;/p&gt;  &lt;p align="justify"&gt;Un cluster HDInsight est créé avec les projets Apache suivant pour le traitement distribué :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;a href="http://hadoop.apache.org/docs/r1.0.4/mapred_tutorial.html"&gt;Map/Reduce&lt;/a&gt; : Map/Reduce constitue en soi une fondation pour le traitement distribué dans Hadoop.&amp;#160; On peut écrire un programme en Java ou tirer parti pour cela d'autres langages et environnements d'exécution grâce à l'utilisation d'&lt;a href="http://hadoop.apache.org/docs/r1.0.4/streaming.html"&gt;Hadoop Streaming&lt;/a&gt;. L’article &lt;a href="http://www.windowsazure.com/en-us/manage/services/hdinsight/using-mapreduce-with-hdinsight/"&gt;Using MapReduce with HDInsight&lt;/a&gt; propose un guide simple pour l’écriture de programmes optimisés sur HDInsight.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;a href="http://hive.apache.org/"&gt;Hive&lt;/a&gt; : Hive est un logiciel d'analyse de données permettant d'utiliser Hadoop avec une syntaxe proche du SQL appelé &lt;a href="https://cwiki.apache.org/confluence/display/Hive/LanguageManual"&gt;HiveQL&lt;/a&gt; et ce, via un mécanisme permettant de projeter une structure sur ces données. Ceci permet d’exprimer des requêtes qui se compilent en un ensemble de programmes Map/Reduce optimisés. Dans la pratique, Hive propose un support pour la plupart des constructions auxquelles on peut s’attendre dans SQL (agrégation, regroupements, filtrage, etc.), et se parallélise facilement à travers les nœuds de votre cluster. L’article &lt;a href="http://www.windowsazure.com/en-us/manage/services/hdinsight/using-hive-with-hdinsight/"&gt;Using Hive with HDInsight&lt;/a&gt; vous propose un premier niveau de guide pour utiliser Hive. Vous pouvez également consulter le tutoriel complet &lt;a href="http://social.technet.microsoft.com/wiki/contents/articles/13846.analyzing-twitter-movie-data-with-hive-in-hadoop-on-azure.aspx"&gt;Analyzing Twitter Movie Data with Hive in Hadoop on Azure&lt;/a&gt; utilisant les données de Twitter.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;a href="http://pig.apache.org/"&gt;Pig&lt;/a&gt; : Pig est une plateforme d'analyse de données comparable à Hive, mais qui utilise un langage de description de flux d’instructions sur les données qui se compile en un ensemble de programmes Map/Reduce à l’aide d’un langage appelé &lt;a href="http://hadoop.apache.org/pig/docs/r0.7.0/piglatin_ref1.html"&gt;Pig Latin&lt;/a&gt;. L’article &lt;a href="http://www.windowsazure.com/en-us/manage/services/hdinsight/using-pig-with-hdinsight/"&gt;Using Pig with HDInsight&lt;/a&gt; propose un guide de démarrage pour Pig avec HDInsight. &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;a href="http://oozie.apache.org/"&gt;Oozie&lt;/a&gt; : Oozie est un ordonnanceur de flux de travail (workflow) pour la gestion d'un graphe acyclique dirigé d’actions, où des actions peuvent être des « jobs » Map/Reduce, Pig, Hive ou d'autres « jobs ». Vous trouverez plus de détails dans le guide de démarrage &lt;a href="http://oozie.apache.org/docs/3.3.0/DG_QuickStart.html"&gt;ici&lt;/a&gt;.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Le &lt;a href="http://blogs.msdn.com/b/windowsazurefrance/archive/2013/03/21/tuto-hadoop-arrive-dans-le-portail-windows-azure-lan-231-ons-des-jobs-java-pig-et-hive-pour-voir.aspx"&gt;billet&lt;/a&gt; de Benjamin Guinebertière offre un tutoriel sur HDInsight pour l’exécution de programmes Map/Reduce, Pig et Hive. Vous pouvez consulter également l’article &lt;a href="http://social.technet.microsoft.com/wiki/contents/articles/16215.a-lap-around-hdinsight.aspx"&gt;A Lap Around HDInsight&lt;/a&gt; sur HDInsight parcourant les sujets de Map/Reduce, Pig et Hive. &lt;/p&gt;  &lt;p align="justify"&gt;HDInsight propose également un certain nombre de compléments propre pour la programmation.&lt;/p&gt;  &lt;h2&gt;Microsoft .NET SDK For Hadoop&lt;/h2&gt;  &lt;p align="justify"&gt;Les équipes Microsoft en charge d’HDInsight travaillent sur la construction un portefeuille d'outils qui permettent aux développeurs de tirer parti de leurs compétences et des investissements en .NET pour utiliser Hadoop. Ces projets sont hébergés sur la &lt;a href="http://hadoopsdk.codeplex.com/"&gt;forge CodePlex&lt;/a&gt;, avec des paquets disponibles à partir de NuGet pour créer des programmes fonctionnant sur HDInsight. &lt;/p&gt;  &lt;p align="justify"&gt;Les outils/bibliothèques suivants sont aujourd’hui notamment disponibles sur la forge sous forme d’un paquet NuGet : &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;a href="http://hadoopsdk.codeplex.com/wikipage?title=Getting%20Started%20With%20Map%20Reduce&amp;amp;referringTitle=Map%2fReduce"&gt;.NET Map/Reduce&lt;/a&gt; : .NET Map/Reduce est un « wrapper » .NET de la bibliothèque Java Hadoop Common pour écrire un programme Map/Reduce. &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;a href="http://hadoopsdk.codeplex.com/wikipage?title=LINQ%20to%20Hive&amp;amp;referringTitle=Home"&gt;LINQ to Hive&lt;/a&gt; : LINQ to Hive permet d’utiliser des requêtes LINQ sur des données gérées par Hive installé (par défaut) sur votre cluster HDInsight. Il est ainsi possible par exemple de créer une base de données Hive sur votre cluster HDInsight, puis, développer une application cliente sur votre machine personnelle qui requête cette base Hive avec LINQ.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;a href="http://hadoopsdk.codeplex.com/wikipage?title=WebHDFS%20Client&amp;amp;referringTitle=Home"&gt;WebHDFS Client&lt;/a&gt; : WebHDFS Client est une abstraction .NET du système de fichiers HDFS d’Hadoop. Il permet ni plus ni moins de créer, de lire, ou de supprimer des fichiers contenu sur votre cluster Hadoop programmatiquement parlant. Il utilise pour cela le service REST WebHDFS du cluster HDInsight.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Pilote HIVE ODBC&lt;/h2&gt;  &lt;p align="justify"&gt;Le pilote HIVE ODBC disponible dans la rubrique &lt;b&gt;Downloads&lt;/b&gt; du portail de gestion de votre cluster HDInsight permet de faire la connexion entre une table Hive et Excel (ou tout autre client ODBC). &lt;/p&gt;  &lt;p align="justify"&gt;L’article &lt;a href="file:///C:\Users\philber\AppData\Local\Microsoft\Windows\Temporary%20Internet%20Files\Content.Outlook\9W29WWNA\o%09https:\www.windowsazure.com\en-us\manage\services\hdinsight\use-excel-via-hive-odbc-driver\"&gt;How to Connect Excel to Windows Azure HDInsight via HiveODBC&lt;/a&gt; vous propose un pas à pas complet.&lt;/p&gt;  &lt;h1&gt;Pour aller plus loin avec Windows Azure HDInsight&lt;/h1&gt;  &lt;p align="justify"&gt;Nous en avons bien conscience, ce billet ne fait qu’effleurer le champ des possibles et il existe beaucoup d’autres fonctionnalités à découvrir dans Windows Azure HDInsight. Ainsi, par exemple, si l’installation depuis le portail d’un cluster HDInsight a été abordée, il est tout à fait possible de réaliser le même type d’opération par API. Un tel déploiement de cluster est décrit dans l’article &lt;a href="https://www.windowsazure.com/en-us/manage/services/hdinsight/howto-deploy-cluster/"&gt;Deploying an HDInsight Service Cluster Programmatically&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Toujours dans le registre de l’automatisation, l’automatisation de l’exécution des jobs cette fois peut s’effectuer via WebHCat (également référencé sous l’appellation Templeton) comme documenté dans l’article &lt;a href="https://www.windowsazure.com/en-us/manage/services/hdinsight/howto-execute-jobs-programmatically/"&gt;Executing Remote Jobs on Your HDInsight Cluster Programmatically&lt;/a&gt;. &lt;/p&gt;  &lt;p align="justify"&gt;Les consoles interactives en JavaScript et Hive permettent une connexion au cluster via une interface Web comme décrit avec l’article &lt;a href="https://www.windowsazure.com/en-us/manage/services/hdinsight/interactive-javascript-and-hive-consoles/"&gt;HDInsight Service Interactive JavaScript and Hive Consoles&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Tout cela représente autant de pistes d’exploration pour faire le meilleur usage du service Windows Azure HDInsight. Ceci étant, au-delà des éléments apportés par ce billet ou par celui de Benjamin, vous pouvez également vous reporter :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Au &lt;a href="http://blogs.msdn.com/b/windowsazure/"&gt;blog MSDN Windows Azure&lt;/a&gt;, qui consacre une série de 5 billets à ce service Windows Azure HDInsight : &lt;a href="http://blogs.msdn.com/b/windowsazure/archive/2013/03/19/getting-started-with-hdinsight.aspx"&gt;Getting Started with HDInsight&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/b/windowsazure/archive/2013/03/21/azure-hdinsight-and-azure-storage.aspx"&gt;Azure HDInsight and Azure Storage&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/b/windowsazure/archive/2013/03/22/developing-for-hdinsight.aspx"&gt;Developing for HDInsight&lt;/a&gt;, etc. &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;A la &lt;a href="https://www.windowsazure.com/en-us/manage/services/hdinsight/?fb=fr-fr"&gt;documentation HDInsight&lt;/a&gt; sur le site Windows Azure.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Comme le titre ce billet, bienvenue dans la version préliminaire de Windows Azure HDInsight et bonne découverte !&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10405359" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Hadoop/">Hadoop</category><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Hive/">Hive</category><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Mahout/">Mahout</category><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Pig/">Pig</category><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Windows+Azure+HDInsight/">Windows Azure HDInsight</category><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/HCatalog/">HCatalog</category><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Templeton/">Templeton</category><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Sqoop+Oozie/">Sqoop Oozie</category></item><item><title>Démarrez avec HDInsight Server !</title><link>http://blogs.msdn.com/b/big_data_france/archive/2013/03/26/d-233-marrez-avec-hdinsight-server.aspx</link><pubDate>Tue, 26 Mar 2013 09:11:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10405345</guid><dc:creator>Philippe Beraud - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/big_data_france/rsscomments.aspx?WeblogPostID=10405345</wfw:commentRss><comments>http://blogs.msdn.com/b/big_data_france/archive/2013/03/26/d-233-marrez-avec-hdinsight-server.aspx#comments</comments><description>&lt;p align="justify"&gt;Les billets &lt;a href="http://blogs.msdn.com/b/big_data_france/archive/2012/12/05/installation-d-hdinsight-server-hadoop-sur-une-machine-windows.aspx"&gt;Installation d'HDInsight Server (Hadoop) sur une machine Windows&lt;/a&gt; et &lt;a href="http://blogs.msdn.com/b/big_data_france/archive/2013/03/25/cr-233-er-une-machine-virtuelle-hdinsight-server-sur-windows-azure.aspx"&gt;Créer une machine virtuelle HDInsight Server sur Windows Azure&lt;/a&gt; disponibles sur ce blog vous ont accompagné quant à la mise en place d’un cluster de test HDInsight Server de façon à disposer rapidement de services Hadoop opérationnels en environnement Windows.&lt;/p&gt;  &lt;p align="justify"&gt;Quelle que soit l’approche que vous ayez retenue au final, nous supposons dans ce billet que vous disposez à ce stade d’une installation opérationnelle d’HDInsight Server. &lt;/p&gt;  &lt;h1&gt;Une rapide présentation&lt;/h1&gt;  &lt;p align="justify"&gt;Rendez-vous dans le dossier C:\Hadoop. C’est ici que tout a été installé.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/3056.image_5F00_57B76013.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/7266.image_5F00_thumb_5F00_6F6E9779.png" width="177" height="206" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Comme vous pouvez le constater, ce dossier racine contient un ensemble de dossiers : &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Avec un premier lieu, un dossier &lt;b&gt;GettingStarted&lt;/b&gt; auquel nous allons nous intéresser très prochainement ;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Un dossier &lt;b&gt;hadoop-1.1.0-SNAPSHOT&lt;/b&gt; correspondant au dossier système d’Hadoop dans l’implémentation &lt;a href="http://hortonworks.com/products/hortonworksdataplatform/"&gt;Hortonworks Data Platform (HDP) 1.1.0&lt;/a&gt; pour Windows Server d’&lt;a href="http://hortonworks.com/"&gt;Hortonworks&lt;/a&gt; ;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Un dossier &lt;b&gt;HDFS&lt;/b&gt; où seront stockées les données sur ce nœud (mais nous n’avons qu’un nœud ici…) ;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Les dossiers &lt;b&gt;Hive-0.9.0&lt;/b&gt;, &lt;b&gt;pig-0.9.3-SNAPSHOT&lt;/b&gt; et &lt;b&gt;sqoop-1.4.2&lt;/b&gt; qui contiennent respectivement les projets/surcouches &lt;a href="http://hive.apache.org/"&gt;Apache Hive&lt;/a&gt; (en version 0.9.0), &lt;a href="http://pig.apache.org/"&gt;Apache Pig&lt;/a&gt; (en version 0.9.3), &lt;a href="http://sqoop.apache.org/"&gt;Apache Sqoop&lt;/a&gt; (en version 1.4.2). Hive est un logiciel d'analyse de données permettant d'utiliser Hadoop avec une syntaxe proche du SQL appelé &lt;a href="https://cwiki.apache.org/confluence/display/Hive/LanguageManual"&gt;HiveQL&lt;/a&gt; et ce, via un mécanisme permettant de projeter une structure sur ces données. Pig est une plateforme d'analyse de données comparable à Hive, mais qui utilise le langage &lt;a href="http://hadoop.apache.org/pig/docs/r0.7.0/piglatin_ref1.html"&gt;Pig Latin&lt;/a&gt;. Enfin, Sqoop est un outil conçu pour l'importation et l'exportation de données à partir de magasins de données structurées telles que des bases de données relationnelles, des entrepôts de données d'entreprise et des systèmes NoSQL ;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Un dossier &lt;b&gt;java&lt;/b&gt; où la machine virtuelle Java (JVM) est installée ;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Un dossier &lt;b&gt;websites&lt;/b&gt; intéressant à certains égards pour nous faciliter la vie au quotidien avec, par exemple, la console JavaScript ou encore l’interface de gestion du cluster, etc.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Ce dossier racine contient enfin les deux scripts start-onebox et stop-onebox pour respectivement démarrer et arrêter le service Hadoop. Dans notre cas de figure, il est déjà démarré.&lt;/p&gt;  &lt;p align="justify"&gt;Naviguez à présent dans le dossier &lt;b&gt;GettingStarted&lt;/b&gt; (C:\Hadoop\GettingStarted). Ce dernier contient trois scripts Windows PowerShell : &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="justify"&gt;buildSamples.ps1 pour compiler les codes source si vous faites des modifications.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;importData.ps1 pour importer depuis un serveur IIS ses fichiers journaux (log) au format &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa814385(v=vs.85).aspx"&gt;W3C Logging&lt;/a&gt;.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;runSamples.ps1 pour lancer les programmes en C# ou en Java, etc. sur le jeu de données importé auparavant. &lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p align="justify"&gt;Sélectionnez le fichier importData.ps1, faites un clic droit, puis sélectionnez &lt;b&gt;Exécuter avec PowerShell&lt;/b&gt; pour le lancer. Trois fichiers appelés data_w3c_small.txt, data_w3c_medium.txt, et data_w3c_large.txt sont alors produits.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/7266.image_5F00_0725CEE0.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/7242.image_5F00_thumb_5F00_4CCA58FE.png" width="220" height="94" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Le script insère ensuite directement les fichiers générés dans HDFS. Pour le vérifier, lancez le &lt;b&gt;Hadoop Command Line &lt;/b&gt;(icone sur le bureau) puis tapez la ligne suivante : &lt;/p&gt;  &lt;p&gt;&lt;span style="list-style-type: disc; -ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: fr; mso-fareast-language: en-us; mso-bidi-language: ar-sa; mso-bidi-font-weight: bold;"&gt;&lt;font style="font-size: 8pt;"&gt;hadoop dfs –ls /w3c/input&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Une rapide explication s’impose : &lt;b&gt;hadoop&lt;/b&gt; fait appel à l’application, &lt;b&gt;dfs&lt;/b&gt; spécifie que nous voulons accéder au système de fichiers, &lt;b&gt;-ls&lt;/b&gt; est un argument qui précise de lister les éléments trouvés (comme sous Unix), et &lt;b&gt;/w3c/input/ &lt;/b&gt;correspond au chemin du dossier.&lt;/p&gt;  &lt;p align="justify"&gt;Vous devriez voir trois dossiers comme ceci : &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/5123.image_5F00_4B198D2A.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/5504.image_5F00_thumb_5F00_50F430C3.png" width="359" height="107" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Le répertoire small contient le fichier data_w3c_small.txt, et ainsi de suite.&lt;/p&gt;  &lt;p align="justify"&gt;Intéressons-nous à présent au script runSamples.ps1. Ce dernier prend 4 arguments :&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;b&gt;scenario&lt;/b&gt; : vous n’en avez qu’un à considérer ici : en l’occurrence « w3c ».&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;b&gt;size&lt;/b&gt; : « small », « medium » ou « large ». Cela correspond au volume de données que vous voulez analyser. Plus il sera petit, plus l’analyse sera rapide (avec toutefois un temps non compressible lié à la soumission du job lui-même).&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;b&gt;method&lt;/b&gt; : « csharp », « java », « pig », ou « hive ». Cela correspond aux deux différentes implémentations du programme, l’une est en Java (dans le dossier du même nom) et l’autre en C#. Vous pouvez d’ailleurs y « jeter un œil » au passage. Pig et Hive présentent simplement un cas d’utilisation dans les deux langages.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;b&gt;job&lt;/b&gt; : « totalhits », « avgtime » ou « errors ». Ce sont vos cas de test. Le premier calcule sur les données le nombre total de vues pour chaque page ; il en ressort une liste. Le deuxième exprime la durée moyenne qu’un utilisateur passe sur une page ; de façon similaire, il en ressort la liste des pages avec le temps passé dessus. Le troisième indique combien d’erreurs sont affichées sur le nombre de visionnages ; cela permet de savoir quelle page pose le plus de problèmes aux visiteurs.&lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p align="justify"&gt;Ces précisions faites, il vous suffit de lancer runSamples dans la console Windows PowerShell depuis le répertoire GettingStarted :&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;cd c:/hadoop/GettingStarted/)&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold;"&gt;&lt;font style="font-size: 8pt;"&gt;powershell –ExecutionPolicy unrestricted –F runSamples.ps1 w3c small java avgtime&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p align="justify"&gt;La commande &lt;b&gt;powershell&lt;/b&gt; permet d’exécuter tout simplement des scripts Windows PowerShell : l’argument -&lt;b&gt;ExecutionPolicy&lt;/b&gt; est nécessaire pour exécuter sans erreur le script, l’argument -&lt;b&gt;F&lt;/b&gt; spécifie l’emplacement et le nom du script. Les quatre mots suivants sont les arguments injectés dans le script PowerShell et correspondent dans l’ordre aux arguments &lt;b&gt;scenario&lt;/b&gt;, &lt;b&gt;size&lt;/b&gt;, &lt;b&gt;method&lt;/b&gt;, et &lt;b&gt;job&lt;/b&gt; vus ci-avant.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/1803.image_5F00_3ABE1571.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/0317.image_5F00_thumb_5F00_0E34E58B.png" width="371" height="231" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Votre job est lancé : vous allez voir apparaître le pourcentage d’avancement des deux étapes « map » et « reduce ». A la fin du traitement, l’affichage de la console permet de faire ressortir le top 3 des pages avec un temps moyen le plus élevé.&lt;/p&gt;  &lt;p align="justify"&gt;Cette rapide introduction étant faite, intéressons-nous à votre première application.&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;h1&gt;Une première application « from scratch »&lt;/h1&gt;  &lt;p align="justify"&gt;Pour votre première application, nous avons besoin d’une problématique à traiter : « Vous voulez savoir quels sont les types de browsers utilisés par les utilisateurs du site hébergé par votre serveur IIS ». &lt;/p&gt;  &lt;p align="justify"&gt;Pour ce faire, vous avez à disposition les fichiers journaux récupérés par l’exercice précédent. Examinons-les.&lt;/p&gt;  &lt;p align="justify"&gt;Ouvrez le fichier data_w3c_small sous C:\Hadoop\GettingStarted\w3c\ data_w3c_small.txt.&lt;/p&gt;  &lt;p align="justify"&gt;On constate que le fichier est constitué de 15 colonnes. Celle qui vous intéresse est l’avant dernière (la 14) : cs(User-Agent) :&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/6165.image_5F00_37C8B0BE.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/1374.image_5F00_thumb_5F00_0347DE76.png" width="531" height="57" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Vous pouvez vous reporter au format W3C Logging des fichiers journaux d’IIS pour plus de détails &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa814385(v=vs.85).aspx"&gt;ici&lt;/a&gt;. En bref, pour ce qui vous intéresse dans le cas présent compte tenu de l’objectif fixé, User-Agent correspond au type de browser. Vous aurez notamment d’indiqué le moteur HTML et le nom du navigateur ensuite. &lt;/p&gt;  &lt;p align="justify"&gt;L’exemple suivant indique que l’utilisateur possède Internet Explorer 10 avec le moteur de rendu HTML Trident (vous savez aussi que le navigateur est installé sur le système d’exploitation Windows 7) :&lt;/p&gt;  &lt;p align="justify"&gt;Mozilla/5.0+(compatible;+&lt;b&gt;MSIE+10.0&lt;/b&gt;;+&lt;b&gt;Windows+NT+6.1&lt;/b&gt;;+WOW64;+&lt;b&gt;Trident&lt;/b&gt;/6.0)&lt;/p&gt;  &lt;p align="justify"&gt;L’article &lt;a href="http://www.useragentstring.com/"&gt;User Agent String explained&lt;/a&gt; vous donne toutes les informations nécessaires sur le browser correspondant à un User Agent donné. &lt;/p&gt;  &lt;h2&gt;Algorithme&lt;/h2&gt;  &lt;p align="justify"&gt;Passons maintenant à l’algorithme Map/Reduce qui sera appliqué par Hadoop sur chacune de nos données.&lt;/p&gt;  &lt;p align="justify"&gt;Vous allez à présent écrire cette application en JavaScript via la console interactive proposée dans le portail de gestion &lt;b&gt;Microsoft HDInsight Dashboard&lt;/b&gt; qui vous permettra de le faire simplement. &lt;/p&gt;  &lt;p align="justify"&gt;Il est en effet proposé aux utilisateurs d’HDInsight (que ça soit Windows Azure HDInsight ou HDInsight Server comme ici) d’écrire le code Map/Reduce en JavaScript. Vous noterez que ceci n’est pas proposé par défaut dans Apache Hadoop.&lt;/p&gt;  &lt;p align="justify"&gt;Une telle capacité permet de se concentrer uniquement sur les parties « importantes » de notre algorithme et masque les parties « superficielles » de Map/Reduce en Java comme les « &lt;b&gt;imports&lt;/b&gt; » ou encore l’instanciation de types spécifiques.&lt;/p&gt;  &lt;p align="justify"&gt;Le code de démonstration est censé être clair… Vous nous le direz ;)&lt;/p&gt;  &lt;p align="justify"&gt;Ouvrez votre environnement de développement (IDE) préféré pour faire du JavaScript. C’est parti ! Si vous n’en avez pas, vous pouvez vous prendre Notepad++ comme dans la suite de ce billet pour les exemples d’illustration. Vous pouvez trouver télécharger une version &lt;a href="http://notepad-plus-plus.org/fr/"&gt;ici&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;A ce stade, vous vous êtes intéressés à la structure fichier journal et vous en avez retiré le numéro de colonne de UserAgent : la 14&lt;sup&gt;ème&lt;/sup&gt;. &lt;/p&gt;  &lt;h2&gt;Map&lt;/h2&gt;  &lt;p align="justify"&gt;Le modèle de base pour la méthode &lt;b&gt;map&lt;/b&gt; en JavaScript est la suivante ; A vous de la personnaliser.&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;var map = function(cle, valeur, context){&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-tab-count: 1;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p align="justify"&gt;Vous y ajoutez ceci : &lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;var parties = valeur.split(new RegExp(&amp;quot;\\s&amp;quot;));&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p align="justify"&gt;Vous éclatez ainsi la valeur qui vous est passée en paramètre dans un tableau parties via une expression régulière. L’élément de séparation des colonnes est &lt;b&gt;\s&lt;/b&gt; ce qui correspond à un espace tout simplement. Pour une première initiation aux expressions régulières, vous pouvez par exemple vous reporter au tutoriel &lt;a href="http://www.siteduzero.com/informatique/tutoriels/concevez-votre-site-web-avec-php-et-mysql/les-expressions-regulieres-partie-1-2"&gt;Les expressions régulières&lt;/a&gt;. &lt;/p&gt;  &lt;p align="justify"&gt;La suite :&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;if(parties.length != 15 || parties[13] == &amp;quot;-&amp;quot;)&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;return;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;&lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc;" align="justify"&gt;&lt;span style="mso-fareast-language: fr; mso-bidi-font-family: &amp;quot;Segoe UI&amp;quot;; mso-bidi-theme-font: minor-latin;"&gt;&lt;font style="font-size: 9pt;"&gt;Vous testez si le tableau « parties » ne contient pas 15 cases pour savoir si le « record » est bien formaté. Vous regardez ensuite si la case n°14 (c’est-à-dire la 13 en partant de 0) est égale au caractère &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 9pt;"&gt;&lt;span style="mso-bidi-font-family: &amp;quot;Segoe UI&amp;quot;; mso-bidi-theme-font: minor-latin;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="mso-fareast-language: fr; mso-bidi-font-family: &amp;quot;Segoe UI&amp;quot;; mso-bidi-theme-font: minor-latin;"&gt;-&lt;/span&gt;&lt;span style="mso-bidi-font-family: &amp;quot;Segoe UI&amp;quot;; mso-bidi-theme-font: minor-latin;"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;span style="mso-fareast-language: fr; mso-bidi-font-family: &amp;quot;Segoe UI&amp;quot;; mso-bidi-theme-font: minor-latin;"&gt;&lt;font style="font-size: 9pt;"&gt;, ce qui indiquerait l’absence de donnée. Si ces tests réussissent, alors le &lt;b style="mso-bidi-font-weight: normal;"&gt;record&lt;/b&gt; est mal formé et vous ne pouvez pas récupérer de clé valide à insérer dans la Map. Donc vous passez au record suivant.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc;" align="justify"&gt;&lt;span style="mso-fareast-language: fr; mso-bidi-font-family: &amp;quot;Segoe UI&amp;quot;; mso-bidi-theme-font: minor-latin;"&gt;&lt;font style="font-size: 9pt;"&gt;Cette ligne permet d’émettre le résultat de la méthode &lt;b style="mso-bidi-font-weight: normal;"&gt;map&lt;/b&gt; sur le record courant. &lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;context.write(p&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;arties[13], 1) ;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p align="justify"&gt;Voici le code complet : &lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;var map = function(cle, valeur, context){&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;var parties = valeur.split(new RegExp(&amp;quot;\\s&amp;quot;));&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-tab-count: 1;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;if(parties.length != 15 || parties[13] == &amp;quot;-&amp;quot;)&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;return;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;context.write(parties[13], 1);&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;&lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p align="justify"&gt;Vous en avez fini avec cette méthode. Passons à l’implémentation de votre Reducer. &lt;/p&gt;  &lt;h2&gt;Reduce&lt;/h2&gt;  &lt;p align="justify"&gt;Le modèle de base se définit comme ceci :&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;var reduce = function(cle, valeurs, context){&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-tab-count: 1;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p align="justify"&gt;Il reçoit en paramètre la clé à laquelle corresponds plusieurs valeurs. Un objet &lt;b&gt;context&lt;/b&gt; aussi permet d’émettre le résultat final.&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;var somme = 0 ;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p align="justify"&gt;C’est votre variable stockant la somme de toutes les valeurs.&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;while(valeurs.hastNext()){&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;somme += parseInt(valeurs.next());&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p align="justify"&gt;Vous bouclez sur les valeurs pour additionner celles-ci dans la somme.&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;context.write(cle, somme);&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p align="justify"&gt;Vous émettez la somme finale pour la clé correspondante.&lt;/p&gt;  &lt;p align="justify"&gt;Voici le code complet :&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;&lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;var map = function(cle, valeur, context){&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;var parties = valeur.split(new RegExp(&amp;quot;\\s&amp;quot;));&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-tab-count: 1;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;if(parties.length != 15 || parties[13] == &amp;quot;-&amp;quot;)&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;return;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-tab-count: 1;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;context.write(parties[13], 1);&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;var reduce = function(cle, valeurs, context){&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;var somme = 0;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-tab-count: 1;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;while(valeurs.hasNext()){&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;somme += parseInt(valeurs.next());&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-tab-count: 1;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;context.write(cle, somme);&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;h2&gt;Exécution&lt;/h2&gt;  &lt;p align="justify"&gt;Vous en avez terminé pour ce qui est du code. Enregistrez ce fichier par exemple sous le nom navigateurs_detection.js à la racine du disque C :&lt;/p&gt;  &lt;p align="justify"&gt;Ensuite, sur le bureau de la machine virtuelle, exécutez le portail de gestion &lt;b&gt;Microsoft HDInsight Dashboard&lt;/b&gt; en cliquant sur le raccourci éponyme.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/6562.image_5F00_40F4C632.png"&gt;&lt;img title="image" style="border: 0px currentcolor; display: inline; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/4431.image_5F00_thumb_5F00_46CF69CB.png" width="42" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Cliquez ensuite sur &lt;b&gt;Interactive Console&lt;/b&gt; dans la section &lt;b&gt;Your Cluster &lt;/b&gt;: &lt;a href="http://localhost:8085/Cluster/InteractiveJS"&gt;http://localhost:8085/Cluster/InteractiveJS&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Exécutez la procédure suivante : Tapez « &lt;b&gt;#put&lt;/b&gt; » dans la console puis&amp;#160; « Entrée ». Cette commande appelle en réalité le système de fichier HDFS pour y insérer un nouveau fichier. Avant d’exécuter du code avec Hadoop, il sera impératif de l’ajouter sur HDFS. Le &lt;b&gt;#&lt;/b&gt; dans la console interactive&lt;b&gt; &lt;/b&gt;précise que la commande suivant celui-ci est une commande générale d’Hadoop. Cette commande &lt;b&gt;#put&lt;/b&gt; correspond à :&lt;/p&gt;  &lt;p&gt;&lt;span style="list-style-type: disc; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: fr; mso-fareast-language: en-us; mso-bidi-language: ar-sa; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;hadoop dfs –put c:/monfichier.ext /mondossierhdfs/monfichier.ext&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/7242.image_5F00_70CF67F3.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/1362.image_5F00_thumb_5F00_48BCB8D4.png" width="357" height="280" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Dans &lt;b&gt;Source&lt;/b&gt;, cliquez sur &lt;b&gt;Browse&lt;/b&gt; pour parcourir et recherchez le fichier JavaScript C:\navigateurs_dectection.js.&lt;/p&gt;  &lt;p align="justify"&gt;Dans &lt;b&gt;Destination&lt;/b&gt;, précisez « ./navigateurs_detection.js », puis cliquez sur &lt;b&gt;Upload&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/4428.image_5F00_359B8C28.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/4812.image_5F00_thumb_5F00_66BAC6C8.png" width="183" height="81" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;A ce stade, vous avez placé votre premier fichier sur HDFS en utilisant la console interactive. &lt;/p&gt;  &lt;p align="justify"&gt;Vous devez vous assurer que le dossier « /w3c/out » qui stockera le résultat n’existe pas, sinon lors de l’exécution du programme, vous rencontrerez une erreur comme suit : «&lt;em&gt;&lt;font color="#ff0000"&gt; … at org.apache.hadoop.util.RunJar.main(RunJar.java:…)…&lt;/font&gt;&lt;/em&gt; ». &lt;/p&gt;  &lt;p align="justify"&gt;En effet, le système HDFS stocke les données une et une seule fois, aucune mise à jour n’est possible ; le caractère immuable des données fait que la parallélisation est possible. Les fichiers que vous stockez sont pour cette raison au final en lecture seule. Si nécessaire, vous pouvez les supprimer au préalable via la commande Hadoop &lt;b&gt;rmr&lt;/b&gt;. Entrez la ligne suivant dans la console JS :&lt;/p&gt;  &lt;p align="justify"&gt;&lt;span style="text-align: left; list-style-type: disc; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Segoe UI&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: fr; mso-fareast-language: en-us; mso-bidi-language: ar-sa; mso-bidi-font-weight: bold; mso-fareast-theme-font: minor-latin;"&gt;&lt;font style="font-size: 8pt;"&gt;#rmr /w3c/out&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;span style="text-align: left; list-style-type: disc; mso-fareast-font-family: &amp;quot;Segoe UI&amp;quot;; mso-ansi-language: fr; mso-fareast-language: en-us; mso-bidi-language: ar-sa; mso-bidi-theme-font: minor-latin; mso-fareast-theme-font: minor-latin; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"&gt;&lt;font style="font-size: 9pt;"&gt;Exécutez ensuite notre code par le biais de la commande &lt;b style="mso-bidi-font-weight: normal;"&gt;runJs&lt;/b&gt; : &lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;span style="text-align: left; list-style-type: disc; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Segoe UI&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: fr; mso-fareast-language: en-us; mso-bidi-language: ar-sa; mso-bidi-font-weight: bold; mso-fareast-theme-font: minor-latin;"&gt;&lt;font style="font-size: 8pt;"&gt;runJs(&lt;span style="-ms-layout-grid-mode: line;"&gt;&amp;quot;&lt;/span&gt;navigateurs_detection.js&lt;span style="-ms-layout-grid-mode: line;"&gt;&amp;quot;&lt;/span&gt;, &lt;span style="-ms-layout-grid-mode: line;"&gt;&amp;quot;&lt;/span&gt;/w3c/input/large&lt;span style="-ms-layout-grid-mode: line;"&gt;&amp;quot;&lt;/span&gt;, &lt;span style="-ms-layout-grid-mode: line;"&gt;&amp;quot;&lt;/span&gt;w3c/out&lt;span style="-ms-layout-grid-mode: line;"&gt;&amp;quot;&lt;/span&gt;) ;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;La fonction &lt;b&gt;runJs&lt;/b&gt; prend comme premier paramètre le chemin d’accès du fichier JavaScript contenant les fonctions &lt;b&gt;map()&lt;/b&gt; et &lt;b&gt;reduce()&lt;/b&gt;. Le deuxième paramètre représente le chemin du répertoire des données à traiter. Vos fichiers journaux sont stockés dedans. Le troisième indique le chemin où sera stocké le résultat de votre traitement Map/Reduce sur les données d’entrée. &lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/6175.image_5F00_2CCB83DC.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/7658.image_5F00_thumb_5F00_19AA5730.png" width="384" height="89" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Une fois l’exécution terminée, un message apparait du type « INFO mapred.JobClient : Map output records=5656 ». Le loader, lui, disparaitra.&lt;/p&gt;  &lt;h2&gt;Visualisation du résultat&lt;/h2&gt;  &lt;p align="justify"&gt;L’exécution de votre programme étant terminée, le résultat a été placé sous le répertoire /w3c/out. Certes, mais comment visualise-t-on le résultat de manière compréhensible ?&lt;/p&gt;  &lt;p align="justify"&gt;Vous pouvez visionner le résultat dans la console JavaScript:&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;&lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc;" align="justify"&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold;"&gt;&lt;font style="font-size: 8pt;"&gt;fichier = fs.read(&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&amp;quot;&lt;/span&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold;"&gt;/w3c/out&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold;"&gt;&lt;font style="font-size: 8pt;"&gt;);&lt;/font&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;table cellspacing="0" cellpadding="2" width="579" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="431"&gt;Nom du browser&lt;/td&gt;        &lt;td valign="top" width="10"&gt;User Agent (chaine identifiant le browser)&lt;/td&gt;        &lt;td valign="top" width="162"&gt;Décompte&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="431"&gt;Chrome 22&lt;/td&gt;        &lt;td valign="top" width="10"&gt;Mozilla/5.0+(Windows+NT+6.1;+WOW64)+AppleWebKit/537.1+(KHTML,+like+Gecko)+Chrome/22.0.1207.1+Safari/537.1&lt;/td&gt;        &lt;td valign="top" width="162"&gt;962&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="431"&gt;Internet Explorer 6&lt;/td&gt;        &lt;td valign="top" width="10"&gt;Mozilla/5.0(Windows; +U;+MSIE+6.0;+Windows+NT+5.1;+SV1;+.NET+CLR+2.0.50727)&lt;/td&gt;        &lt;td valign="top" width="162"&gt;1905&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="431"&gt;Firefox 14&lt;/td&gt;        &lt;td valign="top" width="10"&gt;Mozilla/5.0+(Windows;+U;+Windows+NT+6.1;+WOW64;+en-US;+rv:2.0.4)+Gecko/20120718+AskTbAVR-IDW/3.12.5.17700+Firefox/14.0.1&lt;/td&gt;        &lt;td valign="top" width="162"&gt;919&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="431"&gt;Firefox 14 pour Ubuntu&lt;/td&gt;        &lt;td valign="top" width="10"&gt;Mozilla/5.0+(X11;+Ubuntu;+Linux+x86_64;+rv:14.0)+Gecko/20100101+Firefox/14.0.1&lt;/td&gt;        &lt;td valign="top" width="162"&gt;919&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="431"&gt;Internet Explorer 10&lt;/td&gt;        &lt;td valign="top" width="10"&gt;Mozilla/5.0+(compatible;+MSIE+10.0;+Windows+NT+6.1;+WOW64;+Trident/6.0)&lt;/td&gt;        &lt;td valign="top" width="162"&gt;951&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;h2&gt;Graph&lt;/h2&gt;  &lt;p align="justify"&gt;Il est possible, via la console JavaScript et l’objet &lt;b&gt;graph,&lt;/b&gt; de générer des graphiques en fonction des données récupérées. Il faut cependant les préparer au préalable, et ce de façon à ce que &lt;b&gt;graph&lt;/b&gt; connaisse le formatage de notre résultat.&lt;/p&gt;  &lt;p align="justify"&gt;Commencez par récupérer votre variable « fichier » remplie précédemment, puis parcourez-la à l’aide de la méthode &lt;b&gt;parse&lt;/b&gt; : &lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;resultat = parse(fichier.data, &amp;quot;userAgent,count:long&amp;quot;);&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p align="justify"&gt;La méthode &lt;b&gt;parse&lt;/b&gt; dé-sérialise la chaine contenue dans fichier.data dans un tableau JavaScript (Array). Vous devez lui indiquer comment est formatée la chaine et quelles sont les colonnes avec leurs types (si le type est absent, string est mis par défaut) : userAgent et count.&lt;/p&gt;  &lt;p align="justify"&gt;Voici ce qui est affiché : &lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="justify"&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;[&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="justify"&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;0: {&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="justify"&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;userAgent: &amp;quot;Mozilla/5.0+(Windows+NT+6.1;+WOW64)+AppleWebKit/537.1+(KHTML,+like+Gecko)+Chrome/22.0.1207.1+Safari/537.1&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="justify"&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;count: &amp;quot;962&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="justify"&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="justify"&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;1: {&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="justify"&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;userAgent: &amp;quot;Mozilla/5.0+(Windows;+U;+MSIE+6.0;+Windows+NT+5.1;+SV1;+.NET+CLR+2.0.50727)&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="justify"&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;count: &amp;quot;1905&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="justify"&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="justify"&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;2: {&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="justify"&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;userAgent: &amp;quot;Mozilla/5.0+(Windows;+U;+Windows+NT+6.1;+WOW64;+en-US;+rv:2.0.4)+Gecko/20120718+AskTbAVR-IDW/3.12.5.17700+Firefox/14.0.1&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="justify"&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;count: &amp;quot;919&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="justify"&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="justify"&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;3: {&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="justify"&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;userAgent: &amp;quot;Mozilla/5.0+(X11;+Ubuntu;+Linux+x86_64;+rv:14.0)+Gecko/20100101+Firefox/14.0.1&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="justify"&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;count: &amp;quot;919&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="justify"&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="justify"&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;4: {&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="justify"&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;userAgent: &amp;quot;Mozilla/5.0+(compatible;+MSIE+10.0;+Windows+NT+6.1;+WOW64;+Trident/6.0)&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="justify"&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: en-us; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;count: &amp;quot;951&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="justify"&gt;&lt;span style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 8pt;"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="justify"&gt;&lt;span style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;]&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p align="justify"&gt;Comme vous l’aurez probablement reconnu, il s’agit d’une structure JSON (JavaScript Objet Notation), qui contient 5 éléments. Chaque élément possède deux attributs : &lt;b&gt;userAgent&lt;/b&gt; et &lt;b&gt;count&lt;/b&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Le fait que vous utilisiez JavaScript permet certaines facilités quant à la modification dynamique de cette structure. Vous allez donc en profiter et ajouter un 3&lt;sup&gt;ème&lt;/sup&gt; attribut, en l’occurence &lt;b&gt;name&lt;/b&gt;, et ainsi donner un nom simplifié aux browsers.&lt;/p&gt;  &lt;p align="justify"&gt;D’après le tableau précédent, appliquez le code suivant dans la console :&lt;/p&gt;  &lt;p&gt;&lt;span style="list-style-type: disc; -ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-ansi-language: fr; mso-fareast-language: en-us; mso-bidi-language: ar-sa; mso-bidi-font-weight: bold;"&gt;&lt;font style="font-size: 8pt;"&gt;resultat[0].name = &amp;quot;Chrome 22&amp;quot;; resultat[1].name = &amp;quot;Internet Explorer 6&amp;quot;; resultat[2].name = &amp;quot;Firefox 14&amp;quot;; resultat[3].name = &amp;quot;Firefox 14 Linux&amp;quot;; resultat[4].name = &amp;quot;Internet Explorer 10&amp;quot;;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Vous avez ainsi modifié pour chacun des résultats la structure de l’élément en ajoutant un attribut &lt;b&gt;name&lt;/b&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Construisez maintenant la structure pour paramétrer votre graphique. D’après la documentation, l’objet &lt;b&gt;options&lt;/b&gt; se compose des éléments suivants :&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="400" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="99"&gt;options&lt;/td&gt;        &lt;td valign="top" width="301"&gt;(object) objet d’options, avec&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="99"&gt;x&lt;/td&gt;        &lt;td valign="top" width="301"&gt;(string) Indique quelle propriété est en abscisse&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="99"&gt;y&lt;/td&gt;        &lt;td valign="top" width="301"&gt;(string) Indique quelle propriété est en ordonnée&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="99"&gt;title&lt;/td&gt;        &lt;td valign="top" width="301"&gt;(string) Le titre du graphique&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="99"&gt;orientation&lt;/td&gt;        &lt;td valign="top" width="301"&gt;(number) Utile pour incliner les entêtes de colonne&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="99"&gt;tickInterval&lt;/td&gt;        &lt;td valign="top" width="301"&gt;(number) Pour décaler les entêtes de colonne&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p align="justify"&gt;Tapez le code suivant : &lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;options = {x :&amp;quot;name&amp;quot;, y : &amp;quot;count&amp;quot;, title: &amp;quot;Popularité des navigateurs sur le site&amp;quot;};&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p align="justify"&gt;Vous êtes prêts à présent pour lancer la génération du graphique. Entrez la ligne suivante : &lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-no-proof: yes;"&gt;&lt;font style="font-size: 8pt;"&gt;graph.pie(resultat, options);&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p align="justify"&gt;Et voilà!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/2845.image_5F00_238F489B.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/5076.image_5F00_thumb_5F00_3E5B6EA7.png" width="160" height="160" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;b&gt;graph&lt;/b&gt; est le nom de l’objet JavaScript exposé par la console interactive. La fonction &lt;b&gt;pie&lt;/b&gt; peut être remplacée par la fonction &lt;b&gt;bar&lt;/b&gt; pour avoir un graphique de type histogramme. A vous de jouer à présent ! &lt;/p&gt;  &lt;p align="justify"&gt;Pour cela, vous pouvez visionner la démonstration didactique réalisée par Benjamin Guinebertière lors des &lt;a href="http://msdn.microsoft.com/fr-fr/jj200253"&gt;après-midi du développement&lt;/a&gt;, reprendre le tutoriel &lt;a href="http://cloudcelebrity.wordpress.com/2012/01/05/using-interactive-javascript-for-data-visualization-in-hadoop-on-windows-azure-cluster/"&gt;Using Interactive JavaScript for Data Visualization in Hadoop on Windows Azure Cluster&lt;/a&gt;, consulter le tutoriel &lt;a href="http://www.windowsazure.com/en-us/develop/net/tutorials/hadoop-marketplace/#segment2"&gt;Running Hadoop Jobs on Windows Azure, Importing Data from Windows Azure Marketplace, and Analysing the Data with the Excel Hive Add-In&lt;/a&gt; sur le lancement de jobs avec HDInsight, l’importation de données récupérées depuis Windows Azure Marketplace, ainsi qu’une analyse finale des données avec Excel, etc. &lt;/p&gt;  &lt;p align="justify"&gt;Ceci conclut notre billet. Bien sûr, vous pouvez suivre la même procédure de programme JavaScript sous Windows Azure HDInsight Service comme ce service propose la même console interactive. A ce propos, vous trouverez une documentation sur l’utilisation de la console interactive&lt;b&gt; &lt;/b&gt;&lt;a href="http://social.technet.microsoft.com/wiki/contents/articles/7183.fluent-queries-on-the-interactive-javascript-console.aspx"&gt;ici&lt;/a&gt;. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10405345" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/HDInsight+Server/">HDInsight Server</category></item><item><title>Créer une machine virtuelle HDInsight Server sur Windows Azure</title><link>http://blogs.msdn.com/b/big_data_france/archive/2013/03/25/cr-233-er-une-machine-virtuelle-hdinsight-server-sur-windows-azure.aspx</link><pubDate>Mon, 25 Mar 2013 18:20:13 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10405198</guid><dc:creator>Philippe Beraud - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/big_data_france/rsscomments.aspx?WeblogPostID=10405198</wfw:commentRss><comments>http://blogs.msdn.com/b/big_data_france/archive/2013/03/25/cr-233-er-une-machine-virtuelle-hdinsight-server-sur-windows-azure.aspx#comments</comments><description>&lt;p align="justify"&gt;Comme nous avons déjà eu l’occasion d’en parler ensemble, HDInsight a été développé en &lt;a href="http://hortonworks.com/partners/microsoft/"&gt;partenariat&lt;/a&gt; avec le développeur logiciel et distributeur Hadoop &lt;a href="http://hortonworks.com/"&gt;Hortonworks&lt;/a&gt; et s’appuie sur &lt;a href="http://hortonworks.com/products/hortonworksdataplatform/"&gt;Hortonworks Data Platform&lt;/a&gt; pour mettre à disposition les services Hadoop, et en, particulier &lt;a href="http://hadoop.apache.org/"&gt;Apache Hadoop&lt;/a&gt;, &lt;a href="http://hive.apache.org/"&gt;Apache Hive&lt;/a&gt;, &lt;a href="http://pig.apache.org/"&gt;Apache Pig&lt;/a&gt;, &lt;a href="http://sqoop.apache.org/"&gt;Apache Sqoop&lt;/a&gt;, &lt;a href="http://oozie.apache.org/"&gt;Apache Oozie&lt;/a&gt;, &lt;a href="http://incubator.apache.org/hcatalog/"&gt;Apache HCatalog&lt;/a&gt;, et &lt;a href="http://people.apache.org/~thejas/templeton_doc_latest/index.html"&gt;Apache Templeton&lt;/a&gt;. &lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=285668&amp;amp;clcid=0x409"&gt;Windows Azure HDInsight&lt;/a&gt; et &lt;a href="http://www.microsoft.com/web/gallery/install.aspx?appid=HDINSIGHT-PREVIEW"&gt;HDInsight Server&lt;/a&gt; facilitent le déploiement et la configuration d’Hadoop sur la plateforme Windows (sans avoir de frein sur la création du cluster, le choix des composants à installer, etc.), donnent aux clients ainsi l'accès à une distribution d’Hadoop standard prête pour l'entreprise avec les dernières versions des composants mis à disposition, et permettent à ces derniers de démarrer tout de suite sur leurs données, de voir ce qu’il est possible d’en extraire avec Hadoop, et en complément de bénéficier de la richesse et la puissance de l’offre de BI (Business Intelligence) de Microsoft pour faire ressortir des pistes de réflexion actionnables des Big Data comme nous avons pu l’illustrer &lt;a href="http://blogs.msdn.com/b/big_data_france/archive/2013/01/31/big-data-amp-bi-social-travel-analysis-1-232-re-partie.aspx"&gt;récemment&lt;/a&gt;. D’une façon générale, ces offres Hadoop et SQL Server sont très complémentaires.&lt;/p&gt;  &lt;p align="justify"&gt;Dans la pratique, Windows Azure HDInsight est un service pour l’hébergement de votre cluster Hadoop sur Windows Azure. Nous y reviendrons très prochainement avec la désormais disponibilité de la version préliminaire publique (Public Preview) de Windows Azure HDInsight directement dans le &lt;a href="http://manage.windowsazure.com/"&gt;portail de gestion de Windows Azure&lt;/a&gt;. Si vous disposez d’un compte Windows Azure – si tel n’est pas d’ores et déjà le cas, vous allez pouvoir y remédier dans la suite de ce billet - vous pouvez &lt;a href="http://go.microsoft.com/fwlink/?LinkID=286685"&gt;demander un accès&lt;/a&gt; à la bêta publique et créer alors un cluster HDInsight au sein du portail de gestion de Windows Azure. Une fois votre compte configuré, chaque fois que vous avez besoin d’un cluster pour quelques heures ou quelques jours, il vous suffit de le demander quelques minutes avant dans le portail de gestion de Windows Azure. C’est aussi simple que cela !&lt;/p&gt;  &lt;p align="justify"&gt;HDInsight Server permet de créer son propre cluster Hadoop sur sa machine Windows comme illustré dans un &lt;a href="http://blogs.msdn.com/b/big_data_france/archive/2012/12/05/installation-d-hdinsight-server-hadoop-sur-une-machine-windows.aspx"&gt;précédent billet&lt;/a&gt; et ce, pour réaliser, par exemple, très rapidement des tests et cela permet de réaliser des tests très rapidement. Ce billet a été l’occasion de découvrir ensemble le portail de gestion &lt;b&gt;Microsoft HDInsight Dashboard&lt;/b&gt; pour le cluster déployé alors sur seule instance (un seul nœud donc). &lt;/p&gt;  &lt;p align="justify"&gt;Vous pouvez aisément reproduire cette installation sur votre propre machine Windows mais à bien des égards, il peut s’avérer intéressant de la réaliser pour des fins de test sur une machine virtuelle et pour l’avoir toujours accessible pourquoi ne pas le faire dans Windows Azure (la plateforme PaaS et IaaS de Microsoft pour héberger vos machines virtuelles, créer des réseaux virtuels, et bénéficier de bien d’autres services) ? Cela nous procure un certain nombre d’avantages :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Un portail HTML5 très facile à utiliser,&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Des images Windows 8, Windows Server 2008 R2, Windows Server 2012 prêtes à l’emploi,&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Une installation rapide !&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Une configuration complète pour l’utilisation,&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Une offre 90 jours de tests gratuits !&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Commençons par le commencement. Rendez-vous sur le site de Windows Azure pour vous créer compte de test en profitant de l’&lt;a href="http://www.windowsazure.com/fr-fr/pricing/free-trial/?fb=fr-fr"&gt;offre 90 jours&lt;/a&gt;. Le billet &lt;a href="http://blogs.msdn.com/b/windowsazurefrance/archive/2012/08/29/tuto-comment-souscrire-gratuitement-224-windows-azure.aspx"&gt;[TUTO] : Comment souscrire gratuitement à Windows Azure ?&lt;/a&gt; sur le blog MSDN Windows Azure France propose un pas à pas détaillé pour la création d’un compte de test. Vous pouvez le consulter à cet effet si besoin pour une vue d’ensemble. &lt;/p&gt;  &lt;p align="justify"&gt;Si vous disposez déjà d’un compte Windows Azure actif, vous pouvez passer directement à l’étape de création d’une machine dans le portail.&lt;/p&gt;  &lt;p align="justify"&gt;Naviguez vers &lt;a href="http://www.windowsazure.com/fr-fr/pricing/free-trial/"&gt;http://www.windowsazure.com/fr-fr/pricing/free-trial/&lt;/a&gt; et cliquez sur &lt;b&gt;essayer-la gratuitement &lt;/b&gt;(en vert).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.windowsazure.com/fr-fr/pricing/free-trial/"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/2235.image_5F00_06CD61ED.png" width="405" height="92" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Vous êtes redirigé vers une page de connexion. Précisez votre &lt;a href="http://go.microsoft.com/fwlink/?LinkID=254486"&gt;compte Microsoft&lt;/a&gt; (anciennement Windows Live ID, une adresse email Hotmail, Outlook, MSN, etc.).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/7534.image_5F00_33761BC6.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/5481.image_5F00_thumb_5F00_440E16B4.png" width="465" height="216" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Ensuite, complétez les différents formulaires pour obtenir votre compte Azure.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/1258.image_5F00_1784E6CE.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/5468.image_5F00_thumb_5F00_014ECB7C.png" width="340" height="227" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Il convient de noter qu’une carte de crédit vous sera demandée. Aucun débit ne sera réalisé sur cette carte sauf si vous supprimez explicitement la limite de dépenses associée à ce compte d’essai. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/3324.image_5F00_000A329D.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/4885.image_5F00_thumb_5F00_3E8F8043.png" width="278" height="278" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Une fois votre version d’évaluation Windows Azure activée, vous pouvez accéder au portail de gestion Windows Azure. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/8130.image_5F00_2B0220A2.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/8524.image_5F00_thumb_5F00_17E0F3F6.png" width="478" height="36" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Cliquez sur le bouton bleu &lt;b&gt;Portail &lt;/b&gt;en haut à droite de l’écran. Une petite visite vous attend pour expliquer où trouver les panneaux sur l’interface. Cliquez sur nouveau en bas à gauche de l’interface.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/6064.image_5F00_1B12DBDE.png"&gt;&lt;img title="image" style="border: 0px currentcolor; display: inline; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/6052.image_5F00_thumb_5F00_2F982B5C.png" width="82" height="33" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Nous allons choisir un &lt;b&gt;Ordinateur virtuel&lt;/b&gt; en &lt;b&gt;Création rapide &lt;/b&gt;dans l’onglet &lt;strong&gt;Calcul&lt;/strong&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Le &lt;b&gt;NOM DNS&lt;/b&gt; est le nom de la machine virtuelle sur le réseau. Dans cette illustration, nous avons choisis « vm-hdinsight ». Choisissez &lt;b&gt;Windows Server 2012, October 2012&lt;/b&gt; pour l’image, une taille moyenne sera suffisante. Précisez votre mot de passe administrateur de la machine, et un emplacement. Pour la France, choisissez par exemple &lt;b&gt;Europe de l’Ouest&lt;/b&gt; comme illustré ci-après.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/7534.image_5F00_16302822.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/6076.image_5F00_thumb_5F00_74D08285.png" width="176" height="219" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Cliquez sur &lt;b&gt;CREER UN ORDINATEUR VIRTUEL &lt;/b&gt;pour confirmer la création. La création prend de l’ordre de quelques minutes. &lt;/p&gt;  &lt;p align="justify"&gt;Cliquez sur &lt;b&gt;DEMARRER&lt;/b&gt; si besoin pour exécuter la machine. &lt;/p&gt;  &lt;p align="justify"&gt;Une fois la machine créé, cliquez sur l’onglet &lt;b&gt;ORDINATEURS VIRTUELS&lt;/b&gt; si vous n’y êtes pas déjà. Cliquez sur &lt;b&gt;DEMARRER&lt;/b&gt; en bas de l’interface si besoin pour exécuter la machine que vous venez de créer : vm-hdpinsight.cloudapp.net.&lt;/p&gt;  &lt;p align="justify"&gt;Cliquez sur &lt;b&gt;CONNECTER,&lt;/b&gt; toujours en bas de l’interface. Cela vous propose soit de télécharger un fichier (d’extension « rdp ») soit de l’exécuter (sous Internet Explorer par exemple). Exécutez ce fichier.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/5481.image_5F00_459E96EE.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/6076.image_5F00_thumb_5F00_4459FE0F.png" width="257" height="151" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Cliquez sur &lt;b&gt;Connect&lt;/b&gt; Précisez votre mot de passe administrateur dans le dialogue &lt;b&gt;Windows Security&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/2744.image_5F00_180D515E.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/2251.image_5F00_thumb_5F00_44B60B37.png" width="223" height="223" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;La boîte de dialogue &lt;b&gt;Remote Desktop Connection&lt;/b&gt; s’ouvre. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/2656.image_5F00_6EB6095F.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/3326.image_5F00_thumb_5F00_1B5EC339.png" width="205" height="205" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Cliquez sur &lt;b&gt;Yes&lt;/b&gt; ; vous voici alors dans une session Windows Server avec le &lt;b&gt;Server Manager&lt;/b&gt; ouvert. Ouvrez l’écran &lt;b&gt;Start&lt;/b&gt;. Pour cela, cliquez sur l’icône à gauche dans le titre de la fenêtre &lt;b&gt;Remote Desktop Connection&lt;/b&gt;, sélectionnez &lt;b&gt;Remote commands&lt;/b&gt; puis &lt;b&gt;Start&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/1185.image_5F00_2BF6BE27.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/8611.image_5F00_thumb_5F00_46C2E433.png" width="185" height="161" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Exécutez Internet Explorer. A ce stade, suivez les instructions du tutoriel &lt;a href="http://blogs.msdn.com/b/big_data_france/archive/2012/12/05/installation-d-hdinsight-server-hadoop-sur-une-machine-windows.aspx"&gt;Installation d'HDInsight Server (Hadoop) sur une machine Windows&lt;/a&gt; précédemment publié sur ce blog pour l’installation d’HDInsight Server. L’installation du cluster HDInsight Server s’effectue depuis l’&lt;a href="http://www.microsoft.com/web/gallery/install.aspx?appid=HDINSIGHT-PREVIEW"&gt;environnement Web Platform Installer (Web PI)&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Vous disposez à présent d’un cluster Hadoop de test prêt l’usage. Un prochain billet sera l’occasion de faire un tour vos premiers pas avec.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10405198" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/HDInsight+Server/">HDInsight Server</category><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Windows+Azure/">Windows Azure</category></item><item><title>Vous avez dit Hadoop ? – 2nde partie</title><link>http://blogs.msdn.com/b/big_data_france/archive/2013/03/25/vous-avez-dit-hadoop-2nde-partie.aspx</link><pubDate>Mon, 25 Mar 2013 18:06:40 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10405191</guid><dc:creator>Philippe Beraud - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/big_data_france/rsscomments.aspx?WeblogPostID=10405191</wfw:commentRss><comments>http://blogs.msdn.com/b/big_data_france/archive/2013/03/25/vous-avez-dit-hadoop-2nde-partie.aspx#comments</comments><description>&lt;p align="justify"&gt;Dans la &lt;a href="http://blogs.msdn.com/b/big_data_france/archive/2013/03/25/vous-avez-dit-hadoop-1-232-re-partie.aspx"&gt;première partie&lt;/a&gt; de ce billet, nous avons introduit les origines d’Hadoop et présenté deux premières briques, en l’occurrence :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;HDFS ou la couche de stockage;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Map/Reduce ou la couche de traitement des données.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Dans une seconde et dernière partie, nous nous intéressons à la notion d’ordonnanceur ainsi qu’aux différentes abstractions proposées par l’écosystème Hadoop.&lt;/p&gt;  &lt;h1&gt;Troisième brique : l’ordonnanceur&lt;/h1&gt;  &lt;p align="justify"&gt;L’avantage du modèle au global est qu’il présente d’excellentes performances pour des « jobs » sur des volumes de données en « batch » et Map/Reduce est idéal pour un système de stockage comme HDFS.&lt;/p&gt;  &lt;p align="justify"&gt;Cependant, dans la pratique, la mise en œuvre de ce que nous avons vu juste avant suppose un ordonnanceur ou « scheduler ». En effet, la création/allocation de nouvelles tâches, leur gestion, le fait de synchroniser les processus entre eux, etc. ne se fait pas tout seul et suppose la présence d’un moteur complet qui gère cela au sein d’Hadoop.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://oozie.apache.org/"&gt;Oozie&lt;/a&gt; est un ordonnanceur de flux de travail (workflow) pour la gestion d'un graphe acyclique dirigé d’actions, où des actions peuvent être des « jobs » Map/Reduce mais aussi d'autres « jobs » qui reviennent à cela au final comme par exemple avec &lt;a href="http://hive.apache.org/"&gt;Hive&lt;/a&gt; et &lt;a href="http://pig.apache.org/"&gt;Pig&lt;/a&gt;. Vous trouverez plus de détails dans le guide de démarrage &lt;a href="http://oozie.apache.org/docs/3.3.0/DG_QuickStart.html"&gt;ici&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Les versions futures d’Hadoop introduiront vraisemblablement des évolutions dans ce domaine à l’image des travaux courants sur &lt;a href="http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YARN.html"&gt;YARN (pour Yet Another Resource Negotiator)&lt;/a&gt;. Vous trouverez une description des principes de son fonctionnement &lt;a href="http://hortonworks.com/blog/apache-hadoop-yarn-concepts-and-applications/"&gt;ici&lt;/a&gt;. &lt;/p&gt;  &lt;p align="justify"&gt;A ce jour, l’« inconvénient » du Framework Hadoop est que celui-ci demeure fortement couplé à Map/Reduce et n’est pas (encore) adapté à la résolution de certains problèmes liés aux Big Data comme évoqués en introduction de ce billet. (Ce ne sera peut-être plus le cas demain). &lt;/p&gt;  &lt;p align="justify"&gt;Comme l’illustre ce billet, Hadoop est un excellent outil pour travailler sur le Volume, selon le principe des 3V des big Data (Cf. &lt;a href="http://www.gartner.com/it/page.jsp?id=1731916"&gt;Gartner Says Solving 'Big Data' Challenge Involves More Than Just Managing Volumes of Data&lt;/a&gt;). Pour d’autres aspects comme la Vitesse, des technologies comme &lt;a href="http://msdn.microsoft.com/fr-fr/library/hh750619(v=sql.10).aspx"&gt;Microsoft StreamInsight&lt;/a&gt; de traitement de flux à haut débit ou &lt;a href="http://storm-project.net/"&gt;Storm&lt;/a&gt; s’avèrent mieux adaptés. Nous aurons l’occasion d’y revenir prochainement.&lt;/p&gt;  &lt;p align="justify"&gt;C’est pourquoi le groupe de projet d’Apache en charge du développement d’Hadoop travaille actuellement pour ce découplage et l’ajout de nouveaux paradigmes comme MPI mais ceci est une autre histoire ;)&lt;/p&gt;  &lt;h1&gt;Quatrième brique : Les abstractions&lt;/h1&gt;  &lt;p align="justify"&gt;Depuis l’arrivée du projet principal Hadoop à maturation, plusieurs outils se sont construits sur le moteur d’exécution pour simplifier le développement d’applications. En effet, Hadoop dans son package de base demande que le développeur soit initié au fonctionnement Map/Reduce et qu’il comprenne les bases de la programmation fonctionnelle. &lt;/p&gt;  &lt;h2&gt;Hive&lt;/h2&gt;  &lt;p align="justify"&gt;&lt;a href="http://hive.apache.org/"&gt;Hive&lt;/a&gt; est un logiciel d'analyse de données permettant d'utiliser Hadoop avec une syntaxe proche du SQL appelée &lt;a href="https://cwiki.apache.org/confluence/display/Hive/LanguageManual"&gt;HiveQL&lt;/a&gt; et ce, via un mécanisme permettant de définir un schéma lors de la lecture des données. Il permet d’exprimer des requêtes à la SQL qui se compilent en un ensemble de programmes Map/Reduce optimisés, des implémentations en Java du Mapper et du Reducer comme nous l’avons fait. Il propose pour cela un support pour la plupart des constructions auxquelles on peut s’attendre dans SQL (agrégation, regroupements, filtrage, etc.). Il est toutefois possible de soumettre ses propres classes d’implémentation si nécessaire. &lt;/p&gt;  &lt;p align="justify"&gt;Nous aurons l’occasion d’en parler dans un prochain billet lorsque nous découvrirons Windows Azure HDInsight (ou Hadoop on Windows Azure). &lt;/p&gt;  &lt;h2&gt;Pig&lt;/h2&gt;  &lt;p align="justify"&gt;&lt;a href="http://pig.apache.org/"&gt;Pig&lt;/a&gt; possède lui aussi son propre langage (&lt;a href="http://hadoop.apache.org/pig/docs/r0.7.0/piglatin_ref1.html"&gt;Pig Latin&lt;/a&gt;), mais son approche est différente. Pour faire simple, il est plus facile d’utiliser un langage d’abstraction proche du « pseudo code » pour se focaliser sur la sémantique puis de laisser un compilateur optimiser votre code pour une approche Map/Reduce. &lt;/p&gt;  &lt;p align="justify"&gt;L’avantage de Pig réside dans la simplicité de l’expression d’une suite logique de tâches Map/Reduce sur les données : &lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="left"&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;font style="font-size: 8pt;"&gt;A = LOAD 'data' AS (a, b, c).&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;" align="left"&gt;&lt;span lang="EN-US" style="-ms-layout-grid-mode: line; mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;font style="font-size: 8pt;"&gt;B = FOREACH A GENERATE a, null;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;font style="font-size: 12pt;"&gt;&lt;/font&gt;  &lt;p&gt;Le principal inconvénient est qu’il faut apprendre du coup la syntaxe associée. Ceci étant dit, il est difficile de programmer une application avec Map/Reduce et bien souvent, cette dernière n’est pas bien optimisée. La compilation de celle-ci avec Pig donne des performances excellentes que très peu de développeurs arrivent à surpasser.&lt;/p&gt;  &lt;p&gt;Il existe beaucoup d’autres projets sur Hadoop dû au potentiel de la plateforme comme notamment : &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://mahout.apache.org/"&gt;Mahout&lt;/a&gt; qui apporte des capacités de « Machine Learning » avec des algorithmes sur étagère. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://sqoop.apache.org/"&gt;Sqoop&lt;/a&gt; qui se charge du transfert de données contenues dans des bases de données SQL vers HDFS et inversement.&lt;/li&gt;    &lt;li&gt;Etc. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Vous trouverez sur le &lt;a href="http://hadoop.apache.org"&gt;site officiel Apache Hadoop&lt;/a&gt; la liste des projets Apache dans la rubrique &lt;b&gt;Related Projects&lt;/b&gt;.&lt;/p&gt;  &lt;h2&gt;Hadoop Streaming&lt;/h2&gt;  &lt;p align="justify"&gt;Pour finir, dans l’installation d’Hadoop, on retrouve une bibliothèque appelée &lt;a href="http://wiki.apache.org/hadoop/HadoopStreaming"&gt;Hadoop Streaming&lt;/a&gt;. Cette dernière sert à programmer une application Map/Reduce dans n’importe quel langage de programmation (Python, C#, C++, PHP, etc…). Cette bibliothèque de classes Java écoute pour cela la sortie standard (stdout). &lt;/p&gt;  &lt;p align="justify"&gt;Le principe est le suivant : &lt;/p&gt;  &lt;p align="justify"&gt;Il suffit d’émettre dans celle-ci - avec par un cout en C++ ou un Console.WriteLine() en C# – la clé et la valeur pour la méthode map() puis de récupérer l’entrée – via un cin en C++ ou un Console.ReadLine() en C# – dans la méthode reduce().&lt;/p&gt;  &lt;p align="justify"&gt;Naturellement, écrire puis parser la sortie standard a un coût sur les performances globales d’une application. En dépit de cela, l’approche reste quand même très pratique. &lt;/p&gt;  &lt;p align="justify"&gt;L’article &lt;a href="http://social.technet.microsoft.com/wiki/contents/articles/13810.hadoop-on-azure-c-streaming-sample-tutorial.aspx"&gt;Hadoop on Azure C# Streaming Sample Tutorial&lt;/a&gt; propose un tutoriel complet exposant la méthode pour programmer en C # avec le streaming. Vous pouvez également vous appuyer sur la &lt;a href="http://wiki.apache.org/hadoop/HadoopStreaming"&gt;documentation officielle&lt;/a&gt;.&lt;/p&gt;  &lt;h1&gt;Pour aller plus loin&lt;/h1&gt;  &lt;p align="justify"&gt;Malgré sa longueur et ses deux parties (pour l’atténuer), ce billet ne fait qu’effleurer Hadoop. &lt;/p&gt;  &lt;p align="justify"&gt;Pour aller plus loin, vous pouvez consulter : &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;L’&lt;a href="http://developer.yahoo.com/hadoop/tutorial/"&gt;un&lt;/a&gt; des premiers tutoriels sur Hadoop, très complet, réalisé par l’équipe Yahoo,&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;La &lt;a href="http://hadoop.apache.org/docs/current/"&gt;documentation officielle&lt;/a&gt; du projet Hadoop,&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Le &lt;a href="http://wiki.apache.org/hadoop/"&gt;Wiki associé&lt;/a&gt; où vous trouverez tout le nécessaire,&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Etc.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Les ressources ne manquent pas ! &lt;/p&gt;  &lt;p align="justify"&gt;Il convient d’évoquer également à ce propos l’excellent ouvrage &lt;a href="http://shop.oreilly.com/product/0636920021773.do"&gt;Hadoop: The Definitive Guide, 3rd Edition - Storage and Analysis at Internet Scale&lt;/a&gt; que beaucoup considèrent à juste titre comme LA référence.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://shop.oreilly.com/product/0636920021773.do"&gt;&lt;img title="clip_image002" style="border: 0px currentcolor; display: inline; background-image: none;" border="0" alt="clip_image002" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/1108.clip_5F00_image002_5F00_5FABAA97.jpg" width="107" height="141" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nous espérons en tout cas que ce billet aura su répondre à certaines de vos questions et vous aura donné l’envie d’aller plus loin avec Hadoop :)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10405191" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Hadoop/">Hadoop</category><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Hive/">Hive</category><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Hadoop+Streaming/">Hadoop Streaming</category><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Mahout/">Mahout</category><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Pig/">Pig</category><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Sqoop/">Sqoop</category><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Oozie/">Oozie</category></item><item><title>Vous avez dit Hadoop ? - 1ère partie</title><link>http://blogs.msdn.com/b/big_data_france/archive/2013/03/25/vous-avez-dit-hadoop-1-232-re-partie.aspx</link><pubDate>Mon, 25 Mar 2013 17:58:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10405188</guid><dc:creator>Philippe Beraud - MSFT</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/big_data_france/rsscomments.aspx?WeblogPostID=10405188</wfw:commentRss><comments>http://blogs.msdn.com/b/big_data_france/archive/2013/03/25/vous-avez-dit-hadoop-1-232-re-partie.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/0564.image_5F00_5582B370.png"&gt;&lt;img title="image" style="border: 0px currentcolor; display: inline; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/1638.image_5F00_thumb_5F00_4D8B110E.png" width="150" height="39" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Les Big Data constituent à l’évidence un sujet de prédilection ces derniers temps que ce soit sur les différents blogs de la toile ou dans le cadre des conférences du monde de l’IT. Et lorsque l’on parle de Big Data, un Framework revient en particulier inévitablement sur le devant de la scène : Hadoop (et ce, même si ce dernier ne couvre pas forcément tous les domaines caractérisés par le principe des 3V (Cf. &lt;a href="http://www.gartner.com/it/page.jsp?id=1731916"&gt;Gartner Says Solving 'Big Data' Challenge Involves More Than Just Managing Volumes of Data&lt;/a&gt;), comme la Vitesse notamment)&lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;Pourquoi ce « buzz » ? On peut se dire que les Big Data existent déjà depuis longtemps, sous d’autres appellations, et que ce n’est autre qu’une dénomination marketing. Néanmoins, si on analyse la situation d’un peu plus près, on se rend vite compte que l’apparition d’un Framework a changé la donne.&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Dans ce billet, nous allons nous intéresser à l’écosystème d’Hadoop et ce qu’il propose comme outils. L’objectif n’est pas de faire à nouveau un survol des possibilités de la solution mais plutôt de rentrer dans les « entrailles de la bête ». Malheureusement, il existera toujours des aspects manquants, mais nous allons essayer de traiter les principaux.&lt;/p&gt;  &lt;p align="justify"&gt;Les billets suivants s’intéresseront quant à eux à l’implémentation de solutions avec HDInsight : &lt;a href="http://go.microsoft.com/fwlink/?LinkId=285668&amp;amp;clcid=0x409"&gt;Windows Azure HDInsight&lt;/a&gt; et &lt;a href="http://www.microsoft.com/web/gallery/install.aspx?appid=HDINSIGHT-PREVIEW"&gt;HDInsight Server&lt;/a&gt;.&lt;/p&gt;  &lt;h1&gt;En guise d’introduction&lt;/h1&gt;  &lt;p align="justify"&gt;Hadoop est un Framework pour le développement d’applications massivement parallèles écrit en Java. Concrètement ? Cela veut dire une abstraction des mécanismes complexes liés à la programmation parallèle.&lt;/p&gt;  &lt;p align="justify"&gt;Ils sont :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Souvent difficiles à appréhender (ou bien à adapter).&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Fortement dépendants du système sur lequel l’application s’exécute (ex : architecture à mémoire partagée ou à mémoire distribuée).&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Pour parler de programmation parallèle, nous allons d’abord parler de paradigme.&lt;/p&gt;  &lt;h2&gt;Qu’est-ce qu’un paradigme ?&lt;/h2&gt;  &lt;p align="justify"&gt;D’après notre &lt;a href="http://fr.wikipedia.org/wiki/Paradigme_(programmation)"&gt;« ami » Wikipédia&lt;/a&gt;, c’est une manière de voir les choses ou plus spécifiquement une conception d’un problème en génie logiciel. On peut prendre comme exemples connus : le paradigme procédural, la programmation orientée objet (POO), le paradigme fonctionnel, etc.&lt;/p&gt;  &lt;p align="justify"&gt;Bref, dans la pratique, il existe deux paradigmes lorsqu’on parle de programmation sur systèmes massivement parallèles et ceux-ci découlent de l’architecture sur laquelle on exécute notre solution :&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Le &lt;strong&gt;paradigme à&lt;/strong&gt; &lt;strong&gt;mémoire partagée&lt;/strong&gt; : Celui-ci découle de l’architecture des ordinateurs récents composés de processeurs multi-cœurs. Ces cœurs accèdent à une seule et même mémoire (la RAM) par l’intermédiaire d’un bus. On dit que la mémoire est « partagée ». On fait souvent le raccourci en parlant de programmation SMP (pour symmetric shared memory multiprocessor). Ce paradigme ne nous intéressera pas dans ce billet dans la mesure où il est utilisé pour de faire la programmation parallèle sur simple ordinateur. Il est présenté ici pour comprendre l’évolution de la programmation parallèle.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Le &lt;strong&gt;paradigme à mémoire distribuée&lt;/strong&gt; : Quant à lui, son utilisation est pertinente lorsque l’on programme sur des « clusters ». Un cluster est tout simplement un réseau de serveurs/ordinateurs (on appelle ça des nœuds) sur lesquels s’exécute une application. Cela permet de procéder à de gros traitements en parallèle sans posséder de super ordinateur ; une approche certainement moins onéreuse ;-) Chaque nœud possède sa propre mémoire, il est donc nécessaire de s’envoyer par le réseau les bouts de mémoire nécessaires à un autre traitement. On procède par envoi de message (« Message Passing »).&lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p align="justify"&gt;A la simple description précédente, vous l’aurez compris, ce dernier paradigme pourrait nous intéresser pour les Big Data. Cependant, comme vous le verrez tout de suite après, Hadoop se fonde dans la pratique sur un autre paradigme, appelé Map/Reduce découlant des limitations de ces deux premiers paradigmes, d’où l’intérêt de les introduire très brièvement.&lt;/p&gt;  &lt;h2&gt;Un rapide historique&lt;/h2&gt;  &lt;p align="justify"&gt;Ces architectures présentées précédemment existent déjà depuis fort longtemps (début les années 60 !), alors pourquoi les architectures Big Data sont apparues aussi tard ?&lt;/p&gt;  &lt;p align="justify"&gt;Et bien, tout d’abord parce que, jusqu’à l’avènement d’Internet et surtout du Web 2.0 (encore un « buzzword »…), il n’y avait pas tant de données à traiter que ça. Donc le « Message Passing » fonctionnait. Mais à partir du moment où chaque utilisateur a commencé à produire du contenu (on appelle ça le Web 2.0), la courbe d’évolution du nombre de données s’est transformée en courbe exponentielle. En ce 21&lt;sup&gt;ième&lt;/sup&gt; siècle, à l’heure du tout numérique, désormais toute information a vocation à être « donnée » et toute donnée représente potentiellement un facteur clé pour la réussite d’une organisation, qu’il s’agisse d’un organisme de recherche, d’un acteur du Secteur Public ou d’une entreprise. Je vous renvoie à notre &lt;a href="http://blogs.msdn.com/b/big_data_france/archive/2012/11/30/exploitez-le-171-d-233-luge-des-donn-233-es-187.aspx"&gt;billet d’introduction&lt;/a&gt; pour ce blog.&lt;/p&gt;  &lt;p align="justify"&gt;Le problème pour le traitement du déluge de données aussi omniprésentes est, qu’avec les envois de messages, le réseau se trouve très vite saturé. On perd très vite l’avantage de traiter les données en parallèle.&lt;/p&gt;  &lt;p align="justify"&gt;Jeffrey Dean et Sanjay Ghemahat, deux ingénieurs de chez Google, se sont dès lors investis à trouver une solution au problème. Ils sont partis pour cela d’un principe simple et ingénieux : &lt;strong&gt;Plutôt que de déplacer les données par le réseau, déplaçons le code.&lt;/strong&gt; Entre passer par le réseau 500 Go de données ou 40 Mo de code compilé, un choix semble s’imposer de lui-même !&lt;/p&gt;  &lt;p align="justify"&gt;Leur publication &lt;a href="http://research.google.com/archive/mapreduce.html"&gt;Map Reduce : Simplified Data Processing on Large Cluster&lt;/a&gt;, résultat de ces travaux, décrit les principes d’un nouveau paradigme appelé Map/Reduce en référence aux fonctions map et reduce, parties intégrantes des langages fonctionnels comme Lisp. Son objectif consiste également à proposer une interface simplifiée à la création d’applications massivement parallèles.&lt;/p&gt;  &lt;p align="justify"&gt;C’est à ce moment-là qu’arrive Hadoop. Doug Cutting et Michael J. Cafarella, les deux créateurs, travaillaient précédemment sur un moteur de recherche Open Source du nom de &lt;a href="http://nutch.apache.org/"&gt;Nutch&lt;/a&gt;. Un sous projet de Nutch visant à en faire un moteur d’indexation distribué les a amené à développer pour le fonctionnement interne de leur moteur un système de fichier distribué appelé NDFS (Nutch Distribued File System).&lt;/p&gt;  &lt;p align="justify"&gt;Avec la publication de Map/Reduce facilitant le traitement de larges ensembles de données, ils créeront Hadoop, un Framework composé d’un système de fichier distribué issu de NDFS sur lequel on exécute des traitements parallèles appliquant Map/Reduce.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Voilà l’historique et le cheminement associé. Maintenant concrètement Hadoop qu’est-ce que c’est ?&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;C’est un « runtime » (un moteur d’exécution) qui s’installe sur un cluster. A la base, il est composé d’une bibliothèque de classes Java et tout un paquet d’outils (Hadoop Common), d’un système de fichier HDFS (Hadoop Distributed File System), d’une implémentation Map/Reduce pour la définition de programmes et d’un ordonnanceur comme Oozie par exemple.&lt;/p&gt;  &lt;p align="justify"&gt;Pour faire simple, nous programmons notre application en Java en utilisant les classes de la bibliothèque contenue dans Hadoop Common. Ensuite il suffit de compiler ce code et de le lancer dans le moteur d’exécution. Pour le reste, Hadoop « gère » notre code et s’occupe de tout !&lt;/p&gt;  &lt;p align="justify"&gt;Pour appliquer le principe de base énoncé plus haut, les deux ingénieurs ont planché sur un système de stockage distribué. Les données sont réparties sur les différents nœuds du cluster et le code s’exécute sur chacun des nœuds.&lt;/p&gt;  &lt;h1&gt;Première brique : HDFS (ou la couche de stockage des données)&lt;/h1&gt;  &lt;p align="justify"&gt;HDFS est le nom donné au système de stockage distribué. C’est l’élément sur lequel repose tout le Framework Hadoop. On notera qu’Hadoop prévoit aussi qu’on puisse remplacer le système de fichiers distribué par une autre implémentation qu’HDFS. C’est ce que fait la distribution &lt;a href="http://www.mapr.com"&gt;MapR&lt;/a&gt; par exemple. Dans le cas d’HDInsight sur Windows Azure, on peut utiliser soit HDFS, soit le stockage Windows Azure (ASV, pour Azure Storage Vault).&lt;/p&gt;  &lt;h2&gt;Qu’est-ce qu’un système de fichier ?&lt;/h2&gt;  &lt;p align="justify"&gt;Un système de fichiers (File system) est une abstraction pour stocker, récupérer ou mettre à jour des données. Dans le cas d’HDFS, la mise à jour n’est pas autorisée.&lt;/p&gt;  &lt;p align="justify"&gt;On peut prendre comme exemples les systèmes de fichiers ReFS, NTFS et FAT32 (pour les stockages Windows) ou bien ext3, ext4 (pour les stockages Linux).&lt;/p&gt;  &lt;p align="justify"&gt;HDFS lui est distribué, c’est-à-dire qu’il va diviser les données par paquet ou « split » et ensuite les stocker. La taille d’un paquet est fixée par Hadoop.&lt;/p&gt;  &lt;p align="justify"&gt;Le fait qu’il soit distribué ne se perçoit pas durant l’utilisation car on accède aux fichiers HDFS de manière classique, autrement dit au travers d’une arborescence classique sous la forme dossier/sous_dossier/fichier.extension. Cependant, la donnée est bel est bien répartie sur les différents nœuds avec un mécanisme de réplication (pour le cas où il y aurait perte).&lt;/p&gt;  &lt;p align="justify"&gt;Il est tout à fait possible d’utiliser HDFS sans passer par la partie Map/Reduce d’Hadoop ; c’est ce que fait par exemple &lt;a href="http://hbase.apache.org/"&gt;Apache HBase&lt;/a&gt;, une base de données non-relationnelle.&lt;/p&gt;  &lt;h2&gt;Comment HDFS retrouve l’information ?&lt;/h2&gt;  &lt;p align="justify"&gt;HDFS définit deux types de nœuds : &lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;p align="justify"&gt;&lt;/p&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Le nœud principal ou &lt;b&gt;NameNode&lt;/b&gt; : il s’agit d’un nœud qui a pour fonction de répertorier où sont stockées les données, sur quels nœuds précisément. Si un nœud est hors d’usage, ce dernier a répertorié aussi l’adresse de la réplique de données.&lt;/div&gt;   &lt;/li&gt;    &lt;p align="justify"&gt;&lt;/p&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Le nœud de données ou &lt;b&gt;DataNode&lt;/b&gt; : Ce nœud est réservé pour le stockage de la donnée. Elle est stockée telle quelle (donnée brute). Cela permet à HDFS de rester simple et d’éviter la non prise en charge de certains formats (pour les convertir).&lt;/div&gt;   &lt;/li&gt;    &lt;p align="justify"&gt;&lt;/p&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Le schéma suivant illustre la répartition des fichiers dans HDFS :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/8507.image_5F00_65AE7B69.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/8004.image_5F00_thumb_5F00_007AA176.png" width="556" height="249" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Pour plus d’informations, vous pouvez regarder &lt;a href="http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/Federation.html"&gt;ici&lt;/a&gt;.&lt;/p&gt;  &lt;h1&gt;Deuxième brique : Map/Reduce (ou la couche de traitement des données)&lt;/h1&gt;  &lt;p align="justify"&gt;On présente souvent Map/Reduce en parlant d’Hadoop comme un Framework, mais le terme est inexact. Map/Reduce est une stratégie de parallélisation et lorsqu’on parle de Map/Reduce dans Hadoop, il s’agit de son implémentation.&lt;/p&gt;  &lt;p align="justify"&gt;Greg Andrews définit cinq familles de stratégies (dans son ouvrage &lt;a href="http://www.amazon.com/Concurrent-Programming-Principles-Greg-Andrews/dp/0805300864"&gt;Concurrent Programming: Principles and Practice&lt;/a&gt;), dont une qui s’intitule « le parallélisme récursif », qui n’est autre que l’application du concept de « &lt;a href="http://fr.wikipedia.org/wiki/Diviser_pour_r%C3%A9gner_(informatique)"&gt;diviser pour régner&lt;/a&gt; ».&lt;/p&gt;  &lt;p align="justify"&gt;Il s’agit de décomposer le problème initial en sous-problèmes plus simples, et ainsi de suite jusqu’à ce que le sous-problème soit trivial (ex : oui ou non).&lt;/p&gt;  &lt;p align="justify"&gt;Pour faire une analogie, cela revient à défaire un sac de nœuds en défaisant d’abord les plus petits nœuds. Cette stratégie est facilement parallélisable car chaque sous-problème est indépendant.&lt;/p&gt;  &lt;h2&gt;Le principe de base&lt;/h2&gt;  &lt;p align="justify"&gt;Map/Reduce est une application de cette stratégie dite récursive avec une particularité toutefois : on stocke les résultats dans une Map (au sens programmation du terme).&lt;/p&gt;  &lt;p align="justify"&gt;Prenons un exemple : Nous voulons compter le nombre de vues pour chaque billet de ce blog. Pour cela, nous avons les fichiers journaux (logs) de la plateforme sur laquelle est hébergé ce blog.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Solution&lt;/strong&gt; :&lt;/p&gt;  &lt;p align="justify"&gt;Dans notre programme, nous voulons un affichage avec la page (son url) et le nombre de vues.&lt;/p&gt;  &lt;p class="code" style="margin: 0cm -21.6pt 6pt 0cm; padding: 0cm; border: currentcolor; list-style-type: disc; mso-padding-alt: 0cm 0cm 0cm 0cm;"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-fareast-language: en-us; mso-bidi-font-weight: bold;"&gt;&lt;span style="font-size: 8pt;"&gt;Ex : &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-fareast-language: en-us; mso-bidi-font-weight: bold;"&gt;exploitez-le-171-d-233-luge-des-donn-233-es-187.aspx&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-fareast-language: en-us; mso-bidi-font-weight: bold;"&gt;&lt;span style="font-size: 8pt;"&gt; : 20834 vues &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;(Le nombre est volontairement exagéré, c’est pour l’égo pur ;))&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Explication&lt;/strong&gt; :&lt;/p&gt;  &lt;p align="justify"&gt;La phase de « mapping » va générer, pour chaque ligne de nos fichiers journaux, le nom de la page (qui est notre clé) puis la valeur 1 (pour signaler qu’il y a une vue) dans un objet de type &lt;a href="http://docs.oracle.com/javase/6/docs/api/java/util/Map.html"&gt;Map&lt;/a&gt;. Une méthode map traitera donc chacune des lignes, recevant comme input son adresse relative au document (« offset ») et le contenu correspondant.&lt;/p&gt;  &lt;p align="justify"&gt;La phase de « reduce » va récupérer cet objet Map, puis faire la somme des valeurs trouvées pour une page donnée.&lt;/p&gt;  &lt;p align="justify"&gt;En quelque sorte, Map spécifie ce que nous voulons comme type de résultats (ce qui permet de diviser implicitement le travail) et Reduce rassemble tous ces résultats intermédiaires pour composer le résultat final.&lt;/p&gt;  &lt;h2&gt;L'implémentation de Map/Reduce dans Hadoop (Hadoop MapReduce API)&lt;/h2&gt;  &lt;p align="justify"&gt;Bonne nouvelle : l’implémentation existe déjà dans l’API fournie par Hadoop ; il n’est donc nul besoin d’apprendre un nouveau paradigme. Il suffit d’utiliser les classes fournies par la bibliothèque Hadoop Common. Nous allons en expliquer le mécanisme.&lt;/p&gt;  &lt;p align="justify"&gt;Une application Hadoop est un fichier JAR (Java ARchive) composée d’une classe point d’entrée Main et de deux implémentations : la première de la classe Mapper, l’autre de la classe Reducer.&lt;/p&gt;  &lt;p align="justify"&gt;Dans le Main, on configure ce qu’on appelle un « job ». Il correspond à un traitement sur le cluster. C’est notre problème initial.&lt;/p&gt;  &lt;p align="justify"&gt;Le job prend comme paramètres :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Le répertoire d’entrée,&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Le fichier de sortie qui contiendra le résultat,&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Le type de données en entrée,&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Et celui en sortie.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Il est ensuite exécuté. Voici à quoi ressemble le Main :&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;public static class Main&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;// Ne pas oublier de faire les imports!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="font-size: 8pt;"&gt;public static void main(String[] args) throws Exception{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-tab-count: 2;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;// Classe de configuration fournie par Hadoop Common&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;Configuration config = new Configuration();&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;// Instance du job représentant notre problème. Il a un objet de config et un nom.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;Job job = new Job(config, &amp;quot;le_nom_du_programme&amp;quot;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-tab-count: 2;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;// Configuration du type de contenu en entrée&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;job.setInputFormatClass(TextInputFormat.class); &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;// Configuration du type de contenu du résultat final&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;job.setOutputFormatClass(TextOutputFormat.class);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-tab-count: 2;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;// On spécifie quelle est notre implémentation du Mapper&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;job.setMapperClass(MonMapperImpl.class);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;// On spécifie quelle est notre implémentation du Reducer&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;job.setReducerClass(MonReducerImpl.class);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-tab-count: 2;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;//Configuration du type de la Map. Ici elle sera de type Map&amp;lt;Text, IntWritable&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="font-size: 8pt;"&gt;job.setOutputKeyClass(Text.class);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;job.setOutputValueClass(IntWritable.class);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-tab-count: 2;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;// On donne le chemin d'entrée où sont stockées nos données&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;FileInputFormat.addInputPath(job, new Path(&amp;quot;dossierHDFS/sous_dossier/mon_dossier_data&amp;quot;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;// On donne le chemin de sortie où sera stocké le fichier contenant le résultat&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;FileOutputFormat.setOutputPath(job, new Path(&amp;quot;dossierHDFS/mon_dossier_sortie&amp;quot;));&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-tab-count: 2;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;// On lance le job et on spécifie qu'il faut attendre la fin de celui-ci avant de &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;// terminer le main (true).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;job.waitForCompletion(true);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="list-style-type: disc; mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-fareast-language: en-us; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: fr; mso-bidi-language: ar-sa;"&gt;&lt;span style="font-size: 8pt;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Il convient de noter qu’il est tout à fait possible de définir plusieurs Jobs dans le Main.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Explication de code&lt;/strong&gt; :&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Notre méthode main() s’occupe ici d’instancier un objet Job qui nous est fourni par le package MapReduce de Hadoop (org.apache.hadoop.mapreduce). On le paramètre d’abord par le type de contenu en entrée que nous allons émettre dans la Map. Ce type, TextInputFormat, se trouve également dans l’API. Le deuxième paramétrage est le type de contenu en sortie (Idem que le précédent). Ces deux premiers paramètres vont indiquer au moteur d’exécution qu’en entrée on aura du texte et en sortie également du texte. Simple non ?&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Ensuite, c’est au tour des paramètres indiquant au moteur d’exécution quelles sont nos implémentations. Ici nous avons nommé pour l’exemple « MonMapperImpl » l’implémentation de notre classe Mapper, et « MonReducerImpl » l’implémentation de notre classe Reducer.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Les deux paramètres suivants ciblent le type de l’objet Map» interne au Framework. On va dire que notre clé sera de type « Text » et que notre valeur sera de type « IntWritable » (un entier donc). Chaque paire contenue dans la Map sera identifiée par une chaine de caractère et aura pour valeur un entier. (Mais tout cela dépendra de votre application). Ceci correspond à ce que nous voulons : le nom de la page (Text) et un nombre de vues (IntWritable).&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Les deux derniers paramètres précisent le chemin d’accès au dossier d’entrée, autrement dit là où nos données que nous voulons analyser sont stockées, et le chemin de sortie du fichier de résultat.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Une fois tous ces paramètres spécifiés, nous lançons le Job grâce à la méthode « waitForCompletion() ». Cette méthode à la particularité de prendre en paramètre un booléen qui précise si oui ou non elle bloquera l’exécution des instructions suivantes dans le main jusqu’à ce que le Job soit fini.&lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p align="justify"&gt;Maintenant, nous passons aux implémentations :&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="font-size: 8pt;"&gt;public static class MonMapperImpl extends Mapper&amp;lt;Object, Text, Text, IntWritable&amp;gt; {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;private static final int pagePos = 2;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;static final IntWritable nombreUn = new IntWritable(1);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;private Text clefCourante = new Text();&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;@Override &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;public void map(Object key, Text value, Context context)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;throws IOException {&lt;/span&gt;&lt;span style="mso-tab-count: 3;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;String[] parts = value.toString().split(&amp;quot;\\s+&amp;quot;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;if (parts.length &amp;lt; 0) //only take records with all values &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;return;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;clefCourante.set( parts[pagePos] );&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;context.write(clefCourante, nombreUn);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="list-style-type: disc; mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-fareast-language: en-us; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: fr; mso-bidi-language: ar-sa;"&gt;&lt;span style="font-size: 8pt;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Notre classe MonMapperImpl implémente l’interface « Mapper » qui est générique. Le premier type générique correspond à la clé en entrée de la méthode map (c’est un objet représentant le numéro de ligne courant) et le second correspond à la valeur en entrée (c’est le contenu de cette ligne). Le troisième et le quatrième sont respectivement indiqués pour la clé de sortie et la valeur de sortie de cette méthode.&lt;/p&gt;  &lt;p align="justify"&gt;Ceux-ci permettent à la méthode map() de savoir ce qui lui arrive comme « record » (ici c’est un numéro de ligne et du texte), puis de configurer un objet Context utilisé pour émettre un résultat intermédiaire. (Un « record » par défaut correspond à une ligne au sens Unix (« \n ») dans des données intermédiaires stockées sur le système de fichiers distribué.)&lt;/p&gt;  &lt;p align="justify"&gt;L’interface Mapper spécifie donc une méthode map() à implémenter. La nôtre est simple :&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="justify"&gt;On découpe dans un tableau de chaines de caractères ce qui nous arrive en entrée (l’élément de séparation est un espace Unix : \s).&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;On teste si le tableau est vide. Si oui, on passe au « record » suivant (la ligne suivante).&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;On modifier l’instance clefCourante pour y mettre la chaine contenue dans le tableau à la case numéro 2 car nous savons que nos fichiers journaux sont constitués ainsi : &lt;em&gt;&amp;lt;DateTime&amp;gt; &amp;lt;ip_du_visiteur&amp;gt; &amp;lt;nom_de_la_page.html&amp;gt;&lt;/em&gt;. Le fait d’avoir une seule instance de la clef évite d’en instancier une à chaque fois que la méthode map() est appelée (ce qui fait beaucoup). C’est la même chose pour le nombre un.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;On émet via l’objet output une nouvelle clef trouvée avec la valeur 1 pour signaler que nous l’avons trouvée une fois dans le record.&lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Implémentation du Reducer&lt;/strong&gt; :&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="font-size: 8pt;"&gt;public static class MonReducerImpl extends Reducer&amp;lt;Text, IntWritable, Text, IntWritable&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="font-size: 8pt;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;@Override&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;public void reduce(Text key, Iterator&amp;lt;IntgWritable&amp;gt; values,Context context)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;throws IOException {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-tab-count: 3;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;int compte = 0;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;while( values.hasNext())&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-tab-count: 1;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;compte += values.next().get();&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;if (compte&amp;gt; 0)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-tab-count: 1;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;#160;&amp;#160; &lt;/span&gt;context.collect(key, new IntWritable(compte));&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Notre Reducer ici se déclare comme le Mapper précédent, mis à part le fait qu’il implémente non pas l’interface Mapper, mais bien l’interface Reducer (avec les mêmes types génériques):&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="justify"&gt;On reçoit une clé – le nom de la page- et un itérateur, « values », qui nous permet de parcourir la collection de valeurs remplies par la méthode map(). On boucle donc sur la collection : pour chaque valeur (dans notre cas égale à 1), on incrémente le compteur pour cette clé.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;On émet la paire « nom de la page, compte total » dans le fichier ou les fichiers de sortie. (Le fait que les traitements soient répartis fait que plusieurs fichiers peuvent être générés dans un même dossier. Logiquement, cet ensemble de données peut être lu comme la concaténation de tous les fichiers.)&lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;L’exécution en détail (Hadoop MapReduce System)&lt;/h2&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/5367.image_5F00_1F511554.png"&gt;&lt;img title="image" style="border: 0px currentcolor; margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-01-metablogapi/6740.image_5F00_thumb_5F00_624CE3C1.png" width="424" height="267" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Explication du schéma&lt;/strong&gt; :&lt;/p&gt;  &lt;p align="justify"&gt;Au niveau du nœud principal (head node), le « JobTracker » est responsable de la gestion des ressources, autrement dit du contrôle des nœuds de calcul (worker node). Il gère toute la durée de vie d’un job.&lt;/p&gt;  &lt;p align="justify"&gt;Le « TaskTracker » a des responsabilités plus simples, à savoir lancer les tâches dans l’ordre fourni par le « JobTracker » et périodiquement donner un statut d’avancement de la tâche au « JobTracker ». Ces nœuds de calcul sont les mêmes nœuds que les nœuds de données (data node) évoqués précédemment au niveau de la couche de stockage.&lt;/p&gt;  &lt;p align="justify"&gt;Chaque « Tracker » est une instance de la JVM (Java Virtual Machine).&lt;/p&gt;  &lt;p align="justify"&gt;Il convient de considérer 3 phases successives :&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="justify"&gt;La phase de « mapping »,&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;La phase de « shuffle »,&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;La phase de « reduce ».&lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p align="justify"&gt;Voyons ce qu’il en est.&lt;/p&gt;  &lt;h3&gt;La phase de « mapping »&lt;/h3&gt;  &lt;p align="justify"&gt;Lorsque nous lançons un job, ce dernier s’exécute sur le cluster et commence la phase de Map. Le « JobTracker&lt;strong&gt; &lt;/strong&gt;» au niveau du nœud principal (head node) prend en compte le job et le disperse sur les « TaskTrackers ». Les nœuds de calcul (worker node) reçoivent alors le code à exécuter sur leurs sous-ensembles de données respectifs.&lt;/p&gt;  &lt;p align="justify"&gt;Le code se trouve dans notre classe d’implémentation MonMapperImpl : c’est la méthode « map() ». Dans notre cas de test, la méthode émet en clé le nom de la page du blog visité et puis en valeur (l’entier 1) pour incrémenter le compteur total. Une fois la tâche terminée, le « TaskTracker » signale au « JobTracker » qu’il a fini.&lt;/p&gt;  &lt;h3&gt;La phase de « shuffle »&lt;/h3&gt;  &lt;p align="justify"&gt;Elle est gérée entièrement par le Framework. Elle constitue la phase où nous devons regrouper toutes les valeurs produites pour une même clé par les nœuds de calcul. La phase de « reduce » n’aura plus qu’à les agréger.&lt;/p&gt;  &lt;h3&gt;La phase de « reduce »&lt;/h3&gt;  &lt;p align="justify"&gt;La phase de « reduce » commence quand tous les « TaskTracker » ont terminé leur tâche « map ». Il lance alors une nouvelle tâche sur une JVM qui va s’occuper de la combinaison de tous les résultats intermédiaires et ainsi former le résultat final (principe de « diviser pour régner »).&lt;/p&gt;  &lt;p align="justify"&gt;Plus concrètement ? Notre programme récupère les objets Map de chaque nœud de calcul, puis les agrège. Partons du principe suivant :&lt;/p&gt;  &lt;p align="justify"&gt;Le nœud de calcul n°1 possède une Map avec comme clefs :&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;‘exploitez-le-171-d-233-luge-des-donn-233-es-187.aspx’=&amp;gt;1        &lt;br /&gt;‘tirer-parti-d-un-cluster-hadoop-depuis-ssis.aspx’=&amp;gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Le nœud de calcul n°2 possède une Map avec comme clefs :&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;‘exploitez-le-171-d-233-luge-des-donn-233-es-187.aspx’=&amp;gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Le Reduce va constituer une seule Map avec :&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 6pt; list-style-type: disc;" align="left"&gt;&lt;span style="mso-bidi-font-size: 10.0pt; mso-themecolor: background1; mso-themeshade: 128; mso-bidi-font-weight: bold; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-no-proof: yes;"&gt;&lt;span style="font-size: 8pt;"&gt;‘exploitez-le-171-d-233-luge-des-donn-233-es-187.aspx’=&amp;gt;2        &lt;br /&gt;‘tirer-parti-d-un-cluster-hadoop-depuis-ssis.aspx’=&amp;gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Dans notre cas, nous voulions une somme des 1 pour chaque page correspondante. Mais à vous de voir le Reduce comme il vous plaira. (Il existe une petite optimisation qui fait un « reduce » intermédiaire sur les nœuds de calcul. On l’appelle le « combiner ». Généralement c’est la même classe Reducer qui est utilisée, mais il est possible d’en utiliser une autre.)&lt;/p&gt;  &lt;p align="justify"&gt;Ceci conclut cette première partie du billet. Dans une &lt;a href="http://blogs.msdn.com/b/big_data_france/archive/2013/03/25/vous-avez-dit-hadoop-2nde-partie.aspx"&gt;seconde et dernière partie&lt;/a&gt; nous aborderons la notion d’ordonnanceur et les abstractions proposées par l’écosystème Hadoop.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10405188" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/big_data_france/archive/tags/Hadoop/">Hadoop</category></item></channel></rss>