Académique Documents
Professionnel Documents
Culture Documents
AmliorerlaperformancedesjobsHadoopsurHDInsight|OCTOtalks!
14
Tweeter
Les quatre optimisations que je prsente ici vont faire passer le temps dexcution de 45 minutes moins de
3 minutes. La plus importante tant le passage dun script Pig un code MapReduce.
Je tiens prciser que cet article nest pas une comparaison de performance, il se base sur les connaissances
que je possde un instant T. Il est volontairement subjectif, il explique mon cheminement et les solutions
que jai trouves pour rsoudre mes problmes. Cependant, le blog Octo est un endroit de partage et je
vous invite vivement commenter et partager votre exprience.
Mon use case est simple, je POC avec un cluster Hadoop instanci sur Azure, je reviendrai plus tard sur
quelques avantages etinconvnients l-dessus, mais pour les personnes qui voudraient en savoir plus:
Hadoop in da cloud
Big data selon Microsoft
Mon cluster est compos de 4 nuds, totalisant 24 curs et 24 Go de
RAM. Ma donne se trouve tre les logs de Wikipdia rcuprs au
pralable sur Page view statistics for Wikimedia projects. Je passe la rcupration et la
prparation des logs qui nest pas lordre du jour.
Pour vous donner un ordre dide, le cluster contient 1,3 To de donnes qui correspondent lanne 2014
incomplte lheure o jcris ces lignes. Jai plac toute cette donne sur un stockage persistant dans le
Cloud Azure appel Azure Storage Vault(ASV). Ce stockage est branch au cluster Hadoop. Un cluster
HDInsight utilise par dfaut ce systme de fichier la place dHDFS et stream la donne dentre, puis utilise
HDFS pour les tapes intermdiaires des jobs.
La version HDInsight utilise pour ces tests est la 3.0qui embarque Hadoop 2.2. Voici la documentation sur les
versions embarques par HDInsight.
Deux points:
Lutilisation dASV comme systme distribu en lieu et place dHDFS me permet dalimenter en donnes
ce systme de fichier distribu sans quun cluster Hadoop soit instanci. Je fais donc de grosses
conomies dargent.
Jai la possibilit de consulter les rsultats de mes jobs Hadoop dune autre manire que par lutilisation
des commandes hadoop fs ou via linterface WebHDFS. Il existe pour cela une API daccs ASV
dans plusieurs langages et plateformes (Java, .Net, Javascript, PHP, Python, etc) ainsi que des
explorateurs de fichiers. En voici un que je vous conseille: CloudXplorer dans sa version gratuite 1.0
http://blog.octo.com/ameliorerlaperformancedesjobshadoopsurhdinsight/
1/12
8/7/2015
AmliorerlaperformancedesjobsHadoopsurHDInsight|OCTOtalks!
Azure a dploy un systme appel Azure Flat Network Storage (ou Q10) en 2012 pour apporter aux clients
une trs haute disponibilit de la donne. Le rsultat donne une performance similaire HDFS en lecture
(cest--dire: 800Mo/s) et est plus rapide en criture. Lorsquun nouveau fichier est persist sur HDFS il
crit sur le premier nud, puis une fois la tche termine il rplique sur le deuxime et aprs passe la
rplication sur le troisime nud. ASV lui duplique aussi 3 fois la donne dans le Datacenter local, il
commence par la persister une premire fois puis fonctionne en asynchrone pour les deux rplications. Ce
qui explique la ractivit dcriture sur ASV (en ralit lcriture physique est aussi rapide). Dans son tat
de lart de 2013 sur les stockages cloud, lentreprise Nasuni explique que le systme Q10 opt par Microsoft
est 56% plus rapide que le second en criture et de 39% en lecture sur ses benchmarks.
Lalgorithme
Mon programme possde trois filtres:
Filtrer par langue dintrt (je ne sais pas lire le chinois)
Filtrer par date et ainsi restreindre lanalyse un jour, un mois ou toute une anne.
Filtrer certains noms de page de Wikipdia inintressants dans notre cas. Par exemple: index, Accueil,
undefined.
Deux GroupBy:
Grouper les lments par nom de page pour totaliser les nombres de visites par page.
Grouper les lments par langues pour le top 10 de chacune des langues.
Un OrderBy Desc:
http://blog.octo.com/ameliorerlaperformancedesjobshadoopsurhdinsight/
2/12
8/7/2015
AmliorerlaperformancedesjobsHadoopsurHDInsight|OCTOtalks!
Ordonner les lments par ordre dcroissant du nombre total de visites pour chaque langue.
Un Top:
Limiter le rsultat me semble indispensable sachant que pour une journe le nombre de records est gal
180 millions.
18
19
REGISTERwikipedia.jar;
DEFINECustomInputwikipedia.pig.FileNameTextLoadFunc('20140605');
DEFINESIMwikipedia.pig.SimilarityFunc();
records=LOAD$inUSINGCustomInputAS(filename:chararray,lang:
chararray,page:chararray,visit:long);
filterbylang=FILTERrecordsBYlang=='fr'ORlang=='en'ORlang==
'de';
restrictions=LOAD$restrictionFileUSINGTextLoader()AS(page:
chararray);
joinbypage=JOINfilterbylangBYpageLEFTOUTER,restrictionsBYpage
USING'replicated';
deleteRestrictedWords=FILTERjoinbypageBYSIM(filterbylang::page,
restrictions::page)==false;
groupbypage=COGROUPdeleteRestrictedWordsBY(filterbylang::page,
filterbylang::lang);
sumrecords=FOREACHgroupbypageGENERATEgroup.lang,group.page,
SUM(deleteRestrictedWords.filterbylang::visit)ASvisit_sum;
groupbylang=GROUPsumrecordsBYlang;
20
21
22
23
24
25
26
27
top20=FOREACHgroupbylang{
sorted=ORDERsumrecordsBYvisit_sumDESC;
top=LIMITsorted20;
GENERATEgroup,flatten(top1);
};
storetop20into$out;
06
07
08
09
10
11
12
13
14
15
16
17
CustomInput est une UDF (User Defined Function) de type Load que jai implment pour parser le nom du
fichier log et rcuprer la date afin de la fournir dans chaque record. De plus, dans ce CustomInput jai plac
un InputPathFilter de mon cru afin de filtrer ds le dpart la fentre temporelle sur laquelle je fais mon
analyse (une journe, une semaine, un mois, etc). a vite notamment de rcuprer toute la donne de
2014 (= beaucoup moins de transit rseau), pour ensuite avoir la filtrer dans le Map.
SIM est une UDF de type Eval (on lutilise afin de filtrer les records quon ne veut pas dans le rsultat final =>
les restrictions). Elle teste la similarit dune expression par rapport une autre. Il y a un peu de calcul.
http://blog.octo.com/ameliorerlaperformancedesjobshadoopsurhdinsight/
3/12
8/7/2015
AmliorerlaperformancedesjobsHadoopsurHDInsight|OCTOtalks!
Jai rcupr dans la console les logs de Pig pour les analyser. Jen ai fait des beaux graphiques!
Daprs le graphique ci-dessus je maperois que Pig cre un nombre considrable de tches de reduce
dans le premier Job (999!). En fait, Pig procde par une jointure de type Reduce side entre les deux
data-set (celui avec les logs Wikipdia et celui avec les restrictions, beaucoup plus petit). Notre cluster
possde 4 nuds, jai alors 22 containers. Pig est assez intelligent pour setter le maximum de reducers
possible. Donc les 999 tches sont traites par 22. Si je prends la moyenne des tches de reduce pour le
job_1 (dans le graphique Job_Stats) qui est de 20 secondes :
http://blog.octo.com/ameliorerlaperformancedesjobshadoopsurhdinsight/
4/12
8/7/2015
AmliorerlaperformancedesjobsHadoopsurHDInsight|OCTOtalks!
Jai trouv mon bottle neck. Je marrte ici pour le script Pig, jai fait le choix de ne pas loptimiser (ce qui
serait possible) pour mintresser aux optimisations sur le paradigme MapReduce et supprimer ces 999
reducers.
Job 1
402
Job 2
385
Job 3
406
Job 4
393
Job 5
383
Moyenne (min)
6,5
BOUM! Ce job met en moyenne 6 minutes 30 traiter ce que faisait Pig en 45 minutes. Lacclration est
flagrante, mais je ne suis pas encore satisfait. Je vais donc sur HDInsight pour ouvrir le dashboard Web de
monitoring appel Hadoop Yarn Status.
http://blog.octo.com/ameliorerlaperformancedesjobshadoopsurhdinsight/
5/12
8/7/2015
AmliorerlaperformancedesjobsHadoopsurHDInsight|OCTOtalks!
Dans le rsum du Job, je clique ensuite sur Counters et voici ce que je vois:
Le cluster possde 4 machines et 24 curs, ce qui fait 23 task containers (24-1). Mon job analyse 4
langues, jai donc modifi le nombre de reducers 4. Donc il ne reste plus que 19 containers pour les
mappers. Les mappers peuvent absorber beaucoup de donnes car ils sont nombreux, alors que les reducers
reoivent 2, 5 fois moins de donnes alors quils sont 5 fois moins nombreux. La phase de map rcupre 174
millions de records et filtre 73 millions de records valables pour le reduce. Il ny a donc quun facteur de 2.4
ce qui ne diminue pas assez le volume de records pour ltape finale (cest--dire: en avoir que 10 par
langue).
On constate, de plus, que les 73 millions de records sont spills deux fois, une fois dans le map et une
autre dans le reduce. Ce qui revient un total de 146 millions de records crits sur disque (le spill est le
moment o le ContextBuffer est trop rempli et est vid sur disque pour continuer).
Daprs le Hadoop Definitive Guide: Third Edition, lutilisation dun Combiner serait une solution. Minimiser le
nombre de records qui transitent pendant la phase de Shuffle & Sort vers les reducers. La deuxime solution
serait de faire un top 10 intermdiaire dans les mappers, et dcrire dans le contexte seulement les 25 top10
= 250 records (car il y a 25 splits pour une journe, donc 25 mappers).
Jopte pour la solution 1, avec pour Combiner la classe Reducer que jai dj crite. Cela me fait gagner du
temps par rapport implmenter une logique supplmentaire dans le Mapper, et puis en plus ce nest pas
son rle!
Les rsultats samliorent encore et jarrive passer sous la barre des 4 minutes pour analyser 1 journe.
Job (sur 1 journe)
Job 1
205
Job 2
201
Job 3
198
http://blog.octo.com/ameliorerlaperformancedesjobshadoopsurhdinsight/
6/12
8/7/2015
AmliorerlaperformancedesjobsHadoopsurHDInsight|OCTOtalks!
Job 4
195
Job 5
197
Moyenne (min)
3,32
Je constate maintenant que le nombre de records pass aux Reducers a franchement diminu, ainsi que le
nombre de records spills.
En ralit, Hadoop rserve des containers pour les tches de reduce ds la fin du premier mapper afin que
les reducers puissent commencer tlcharger les records et les fusionner pendant que les autres
mappers finissent leur travail. Cest plutt intressant, niveau performance, quand il y a beaucoup de records
en sortie des mappers transfrer par le rseau vers les reducers et quil existe trop de splits pour terminer
les calculs en un seul passage.
Attention: il faut distinguer deux choses lorsque lon parle de reduce. Comme lexplique Ed Mazure dans sa
rponse, la phase de reduce est compose de trois parties.
1. Rcupration des records en sortie de map (de 0 33%)
2. Fusion des records ayant les mmes cls (de 33 67 %)
3. Application de la mthode reduce surcharge par lutilisateur (de 67 100%)
De mon ct, trs peu de records sortent des mappers grce au Combiner, donc jai plutt intrt utiliser le
maximum de containers pour la phase de map plutt que dutiliser des containers pour les reducers qui se
tournent les pouces.
Deux proprits dans la configuration du cluster vont mtre utiles:
mapreduce.jobtracker.maxtasks.perjob => cette proprit peut tre mise -1 pour prciser que le cluster
http://blog.octo.com/ameliorerlaperformancedesjobshadoopsurhdinsight/
7/12
8/7/2015
AmliorerlaperformancedesjobsHadoopsurHDInsight|OCTOtalks!
On peut voir dans la colonne Complete que 24 tches map sont dj traites (plus de 5%), pour autant le
cluster continue de rserver les containers aux tches map qui sont au nombre de 22 dans la colonne
Running.
job
Job 1
183
Job 2
168
Job 3
172
Job 4
170
Job 5
164
Moyenne (min)
2,856666667
http://blog.octo.com/ameliorerlaperformancedesjobshadoopsurhdinsight/
8/12
8/7/2015
AmliorerlaperformancedesjobsHadoopsurHDInsight|OCTOtalks!
Lavantage que jen ai: tous les splits vont tre traits en une seule fois, jvite le comportement par default:
les 22 premiers splits sont traits dans la premire vague, puis 3 splits sont traits dans la deuxime vague
avec 19 containers inutiliss. Ce quindique la capture suivante >
Le temps total dexcution des tches map quivaut la tche la plus longue de la premire vague ajout la
tche la plus longue de la deuxime vague (en orange):
Cest dommage, autant navoir quune seule vague qui dure un tout petit peu plus (2 minutes). Pour rgler
ce dtail, jutilise alors un InputFormat particulier: CombineTextInputFormat. Il permet de fusionner plusieurs
fichiers dentre, on lutilise notamment pour des jobs sexcutant sur beaucoup de petits fichiers afin
dviter loverhead dune nouvelle instance de mapper procdant un calcul trs court.
De mon ct, je ne lutilise que pour une seule chose: spcifier la taille du split, et cest lui qui va se charger
dagrger les fichiers entre eux et de dcouper la donne en split. Ensuite, les mappers streameront
directement le nombre de bytes prcis quivalent 1/22 de la taille globale.
Et les rsultats:
Job (sur 1 journe)
Job 1
162
Job 2
161
Job 3
171
Job 4
159
Job 5
157
http://blog.octo.com/ameliorerlaperformancedesjobshadoopsurhdinsight/
9/12
8/7/2015
AmliorerlaperformancedesjobsHadoopsurHDInsight|OCTOtalks!
Moyenne (min)
2,7
Jai fait une petite courbe dvolution histoire de me rendre compte de la progression:
Lvolution de la courbe varie peu aprs le passage de Pig un code MapReduce. Mais si je me focalise sur
lvolution entre le premier code MapReduce sans optimisation et le dernier avec toutes les optimisations, le
temps dexcution a diminu de plus de la moiti.
Gagner 10% sur un job qui dure 3 minutes nest pas trs reprsentatif mais lchelle dune journe, a
reprsente 2 heures et de demi. a peut tre intressant de grappiller quelques pourcents quand vous avez
beaucoup de jobs lancer, avec une utilisation forte de votre cluster. On peut se demander le gain des
optimisations aprs lapplication dun Combiner par rapport au temps pass. Cest pourquoi jai lanc la
comparaison sur une semaine entire:
avec lutilisation dun Combinerseulement : 16 minutes 45 s en moyenne
avec lajustement de la taille des splits: 12 minutes 28 s en moyenne
Cest la fin
Jestime que mon algorithme est suffisamment optimis pour la suite qui serait de le faire tourner sur toute
une anne. Lanalyse est lance avec 220 mappers pour dcouper les 1,3 To, ce qui (thoriquement) lancera
successivement 10 vagues de mappers. Le job mettra 3 heures sexcuter.
Pour aller plus loin, je pourrais regarder du ct de lquilibrage de mes mappers, afin quils avancent tous
la mme vitesse (il y en a certains qui mettent 10 minutes de moins que dautres). Il serait peut-tre plus
pertinent de dcouper les splits par nombre de records plutt que par nombre de bytes, cette technique
prendrait donc en compte la fin des fichiers. Mais ce sera pour un autre article.
http://blog.octo.com/ameliorerlaperformancedesjobshadoopsurhdinsight/
10/12
8/7/2015
AmliorerlaperformancedesjobsHadoopsurHDInsight|OCTOtalks!
Je vous invite lire aussi les rfrences ci-dessous qui pourront vous aider votre tour sur lamlioration de
la performance de vos jobs MapReduce.
Les leons apprises:
La performance sur des stratgies de paralllisation dpend fortement de linfrastructure sur laquelle elles
ARCHI & TECHNO
MTHODE
DIGITALISATION
BIG DATA
sexcutent. A nous de faire les rglages pour adapter le code linfrastructure.
Lefficacit dun algorithme MapReduce se trouve dans la capacit mettre le maximum de calculs et
traitements dans les mappers.
Mme si le job sexcute rapidement, explorer les mtriques du tableau de bord Hadoop pour dceler
des problmes ventuellement masqus avant de passer lchelle.
Les optimisations sans mesure ne servent rien. Je ne lai pas retrac ici, mais cest la premire erreur
que jai faite: chercher optimiser le code alors que le problme tait ailleurs.
STRATGIE SI
VNEMENT
Avec tous ces Tips, plus la doc en dessous vous allez tre invincibles!
Rfrences:
Le fichier de configuration MapReduce mapreduce-default.xml dHadoop avec la description de chaque
proprit;
MapReduce Patterns, Algorithms, and Use Cases sur le site Highly Scalable Blog pour comprendre quel
algo correspond quel cas dusage avec une pseudo implmentation MapReduce lappui ;
10 MapReduce Tips sur le blog Cloudera;
12 keys to keep your Hadoop Cluster running strong and performing optimum, dAvkash Chauhan;
Hadoop Performance Tuning le livre blanc de la socit Impetus ;
Why use Blob Storage with HDInsight on Azure de Brad Sarsfield et Denny Lee;
The State of Cloud Storage de lentreprise Nasuni;
Tuning Hadoop on Dell PowerEdge Servers par Donald Russell;
My recent experience with Hadoop;
http://www.youtube.com/watch?v=fXW02XmBGQw
Suggestion d'articles :
1.
2.
3.
4.
5.
Cet article a t post dans archi & techno, big data et taggu big data, Hadoop, HDInsight, Map Reduce,
Microsoft, performance, Pig. Bookmarkez le permalien.
<
Multitches ou ractif ?
http://blog.octo.com/ameliorerlaperformancedesjobshadoopsurhdinsight/
11/12
8/7/2015
AmliorerlaperformancedesjobsHadoopsurHDInsight|OCTOtalks!
Laisser un commentaire
Votre adresse de messagerie ne sera pas publie. Les champs obligatoires sont indiqus avec *
Nom *
Adresse de
contact *
Site web
Commentaire
Vous pouvez utiliser ces balises et attributs HTML (HyperText Markup Language): <ahref=""title=""><abbrtitle="">
<acronymtitle=""><b><blockquotecite=""><cite><code><deldatetime=""><em><i><qcite=""><s>
<strike><strong>
Laisseruncommentaire
NOUS CONNATRE
NOTRE MISSION
NOUS REJOINDRE
INTERNATIONAL
Pourquoi OCTO ?
OCTO attraction
Paris
O trouver OCTO ?
Rabat
L'vnement USI
Publications
tre OCTO
Lausanne
Investisseurs
vnements
FAQ
So Paulo
Academy lite
Sydney
Nos partenaires
http://blog.octo.com/ameliorerlaperformancedesjobshadoopsurhdinsight/
12/12