Académique Documents
Professionnel Documents
Culture Documents
`
A la r eception des digests dun map, le Jobtracker les compare avec les r esultats
d ej` a recus des autres r eplications.
Si la majorit e actuelle nest pas ce r esultat ou bien si un autre r esultat poss` ede la
m eme valeur : resch eduler une autre r eplication.
Lorsque toutes les Maps sont termin ees : elire le bon r esultat pour chaque Map
et sch eduler les reduces en leur indiquant la liste des digests elus.
Les reduces copient les r esultats pour chaque r eplication, calculent le digest de
ce r esultat et le comparent avec celui que le Jobtracker a elu.
Si il existe une incoh erence ` a ce niveau, les reduces t el echargent le r esultat dune
autre r eplication de ce map, sinon ils consid` erent que cest le bon r esultat.
La gestion des reduces se fait de la m eme mani` ere que celles des maps. Elles
ne peuvent committer leur r esultat que lorsque toute reduce sest termin ee et
quapr es que le Jobtracker ait pris connaissance du bon r esultat ` a la majorit e.
! ! ! ! ! ! ! ! ! ! ! ICI ALGO! ! ! ! ! ! ! ! ! ! !
6.4.2 Au niveau de HADOOP
Deux param etres modiables dans le chier de conguration mapred-site.xml ont
et e ajout es.
17
mapred.job.timer : timeout des timers pour d etecter la non-r eponse des esclaves
(vaut 15 minutes par d efaut)
mapred.job.BFT : nombre de fautes byzantines tol er ees, equivalent ` a la variable
f de lalgorithme (vaut 1 par d efaut)
6.4.3 Au niveau de la machine matre
Au niveau du Jobtracker nous avons rajout e deux classes supl ementaires pour impl ementer
la tol erance aux pannes byzantines.
Une classe BFTmanager : g` ere lensemble des traitements ` a faire sur un Job. Il fait
ofce de serveur pour acceuillir les digests des t aches.
Une classe BFTinfoTask : qui maintient des informations en temps r eel sur les t aches
dun Job. Cette classe contient principalement des tables de hachage <digest,entier>,
des compteurs qui permettent le scheduling des r eplications etc.
Au moment de linitialisation dun Job, on instancie un objet de la classe BFTmanager
et on d emarre le serveur. Un nouvel attribut de type BFTmanager a donc et e ajout e
dans la classe JobInProgress.
1 this.bftmanager= new BFTmanager(this);
2 Thread t=new Thread(this.bftmanager);
3 t.start();
Listing 8 M ethode initTasks() de JobInProgress : instanciation et d emarrage du
BFTmanager
Description de la classe BFTmanager :
Cette classe contient des attributs qui font ofce de constantes tels que, le port sur
lequel le serveur tourne, le minimum et le maximum de r eplications que lon peut lan-
cer (respectivement f+1 et 2f+1), le nombre de fautes tol er ees (i.e. f) et la valeur du
timeout des timers.
Elle poss` ede egalement deux tableaux de BFTinfoTask : un tableau pour les maps et un
tableau pour les r educes. Ainsi si un job poss` ede m maps et r reduces, la taille de ces
tableaux sera respectivement m et r.
Description de la classe BFTinfoTask :
Les principaux attributs :
digests : un tableau de HashMap<String,Integer>qui permet de stocker le nombre
doccurrences des digests recus. Si lobjet repr esente une t ache map, la taille de
ce tableau sera egale au nombre de reduces du Job sinon la taille sera egale ` a 1.
En effet, nous rappelons que les r esultats des maps sont divis es en n partitions
o` u n est le nombre de reduces du Job. Ainsi les digests de la partition p seront
stock e dans la p ` eme case du tableau. La HashMap associe un compteur ` a chaque
digest recu et permettra par la suite de d eterminer le digest qui a la majorit e.
attemptToDigests : une HashMap<TaskAttemptID,String[]> qui associe ` a une
r eplication les digests quelle a envoy e.
18
hosts : une HashMap<String,Timer> qui associe un nom dh ote, sur lequel
est ex ecut ee une r eplication, ` a son timer. Ceci permet didentier les timers de
mani` ere unique puisque nous garantissons que chaque r eplication sex ecute sur
une machine diff erente. Lobjectif second est de pouvoir ainsi stocker des infor-
mations sur les h otes d efaillants.
hostTimeout : Set<String> est un ensemble qui stocke les noms dh otes sur
lequel le timer sest d eclench e. Cet attribut nest pas utilis e dans l etat actuel des
chose mais pourra servir par exemple dans un d eveloppement futur pour interdir
de sch eduler des t aches sur des h otes qui seront dans cet ensemble.
shouldReply : un bool een qui vaut vrai quand une t ache doit etre r epliqu ee.
Initialis e ` a faux, il passe ` a vrai lorsque la premi` ere tentative a et e distribu ee sur
le site.
Des compteurs pour contr oler la r eplication dune t ache sont egalement n ecessaires :
numReplicationToLaunch : initialis e ` a f+1, ce compteur est incr ement e ` a chaque
incoh erence de digest. Il sera egal au maximun ` a 2f+1.En r esum e ce compteur
est egal au nombre de r eplication ` a sch eduler.
numReplicationLaunched : initialis e ` a 0, ce compteur est incr ement e d` es quune
r eplication a et e attribu ee sur une machine.
`
A linverse, il est d ecr ement e d` es
quun timer se d eclenche. Lorsquil est egal ` a numReplicationToLaunch, le bool een
shoulReply passe ` a faux et indique que la t ache nest plus ` a r epliquer.
numReplicationFinished : initialis e ` a 0, ce compteur est incr ement e lorsque
le BFTmanager recoit les digests dune r eplication, ceci indique donc quune
r eplication vient de se terminer. Lorsque sa valeur est egale ` a numReplicationTo-
Launch, ceci indique que toutes les r eplications se sont termin ees. Il est possible
ainsi de d ecider quels sont les digests qui poss` edent la majorit e pour valider le
r esultat dune t ache.
Tout acc` es sur ces attributs se fait de mani` ere synchronis ee pour eviter les probl` emes
de concurence.
Dans le code initial dHadoop, d` es quune r eplication se terminait avec succ` es, les
autres tentatives etaient tu ees. Pour la gestion des pannes byzantines, il est indispen-
sable de bloquer ce m ecanisme, car il faut en effet attendre que toutes les r eplications
dune t ache se terminent pour faire une election. Il a fallu donc ajouter un nouvel etat
de t ache dans la classe TaskStatus ainsi que dans TaskCompletionEvent. Ce nouvel
etat que nous avons appel e DIGEST SENT, indique que la t ache vient denvoyer ses
digests au BFTmanager, et est en attente de pouvoir se terminer.
Cas des MAPS :
An de pr eserver le r esultat de chaque r eplication jusqu` a la n du MapReduce, les
maps sont mis ` a SUCCEEDED localement sur chaque Tasktracker mais ne sont pas
toujours termin es aux yeux du JobTracker. Lors du passage dans la m ethode update-
TaskStatus, le statut de la t ache sera ` a SUCEEDED mais ne sera pas mis a jour sur le
Jobtracker. Le code ci-dessous permet cela.
1 if(status.getIsMap()){
2 if( !tip.isJobCleanupTask() && !tip.isJobSetupTask() && !
tip.isCleanupAttempt(status.getTaskID())){
3
4 if( ((finishedReduceTasks + failedReduceTIPs) !=
numReduceTasks)
19
5 && this.bftmanager.digestReceived(taskid,status.
getIsMap())
6 && status.getRunState() != TaskStatus.State.
DIGEST_SENT){
7 return;
8 }
9 }
10 }
Listing 9 M ethode updateTaskStatus de JobInprogress : blocage de la terminaison
des maps
1 if(state == TaskStatus.State.DIGEST_SENT){
2 System.out.println("PASSAGE dans DIGEST_SENT pour "+
taskid);
3 taskEvent = new TaskCompletionEvent(
4 taskCompletionEventTracker,
5 taskid,
6 tip.idWithinJob(),
7 status.getIsMap() &&
8 !tip.isJobCleanupTask() &&
9 !tip.isJobSetupTask(),
10 TaskCompletionEvent.Status.DIGEST_SENT,
11 httpTaskLogLocation
12 );
13 if(status.getIsMap())
14 finishedMapTasks++;
15
16 }
Listing 10 M ethode updateTaskStatus de JobInprogress : notication de la
localisation du r esultat dune t ache map pour les reduces
D es quune t ache de map passe ` a DIGEST SENT avant de passer ` a SUCCEE-
DED, un ev enement TaskCompletionEvent est cr e e sur le matre indiquant aux re-
duces (thread interne GetMapsEventsThread du ReduceCopier) la localisation du -
chier contenant le r esultat du map. Les maps se terminent d esormais apr` es les reduces
lors de la t ache de cleanup du JOB. De ce fait il nexiste plus de maps qui sont d eclar ees
SUCCEEDED dans le compte rendu nal du map-reduce. Elles sont tu ees par la t ache
de cleanup du Job. Or cette t ache de cleanup ne pouvait se d eclencher que si toutes
les maps et les reduces etaient d eclar ees termin ees. Il a fallu donc contourner ceci en
supprimant la prise en compte de la nalit e des maps, lors du lancement du cleanup.
1 // Check if all maps and reducers have finished.
2 boolean launchCleanupTask =
3 ((finishedMapTasks + failedMapTIPs) == (numMapTasks));
4 /
**
Modification 9/07/2010 : task replication
**
/
5 launchCleanupTask=true;
6 /
**********************************************
/
7 if (launchCleanupTask) {
8 launchCleanupTask =
9 ((finishedReduceTasks + failedReduceTIPs) ==
numReduceTasks);
10 }
20
11 return launchCleanupTask;
Listing 11 M ethode canLaunchJobCleanup de JobInprogress : non-prise en compte
de la nalit e des maps
Cas des REDUCES :
Les reduces sont lanc ees lorsque toute les t aches de maps ont termin e. Lorsque quelles
auront ni leur traitement, elles passeront ` a l etat DIGEST SENT puis ` a l etat COM-
MIT PENDING. Nous avons rajout e un m ecanisme sur lautorisation de committer.
Initialement il sufsait d etre la premi` ere r eplication ` a faire la demande de commit.
Avec notre code il faut bien s ur que les autres r eplications soient termin ees et avoir un
digest egal ` a celui qui a et e elu. Il a fallu modier le code de la m ethode updateTaskS-
tatus.
1
2 if (!wasComplete /
***
Modification
3 INITIALEMENT && !wasPending
*
/
4 ) {
5 /
**
Modification 9/07/2010 : task replication
**
/
6 //check if we have received all digests and if the
digest of tip is correct
7 if(!this.bftmanager.canCommit(taskid, status.getIsMap
())){
8
9 return;
10 }
11 System.out.println(""+taskid+" can commit");
12 /
**********************************************
/
13 tip.doCommit(taskid);
14 }
15 return;
Listing 12 M ethode updateTaskStatus de JobInprogress : contr ole du commit
La m ethode canCommit du BFTmanager r epond faux si le digest nal na pas en-
core et e calcul e (i.e. toute les r eplications nont pas encore envoy e leurs digests), ou
bien si le digest de la tentative qui fait la demande de commit ne correspond pas au
digest calcul e. Cette m ethode r epond vrai dans les autres cas. Lappel ` a tip.doCommit
reprend ensuite le m ecanisme initial qui etait dautoriser uniquement la premi` ere de-
mande. Apr` es toute demande qui a et e accept ee suit la copie des r esultats sur le HDFS.
Les reduces passeront comme pr evu initialement ` a COMMIT PENDING avant de pou-
voir transf erer leur r esultat sur le HDFS.
Ordonnancement des t aches :
Contrairement aux pannes franches nous privil` egeons maintenant la r eplication au lan-
cement de nouvelle t aches. Les m ethodes ndNewMapTask et ndNewReduceTask ont
et e modi ees en cons equence. Au d ebut de ces fonctions, la fonction getIdMapForRe-
plication (ou getIdReduceForReplication) de la classe BFTmanager retourne un iden-
tiant de t ache ` a r epliquer. Si ces fonctions retourne -1, cela signie quaucune t ache
d ej` a lanc ee nest ` a r epliquer (getIdReduceForReplication peut renvoyer -2 si toutes les
21
t aches de map nont pas termin e). Ainsi le code initial s ex ecute pour lancer une nou-
velle t ache. Lorsquune nouvelle t ache est lanc ee, la m ethode taskLaunched de BFT-
manager est appel ee pour indiquer quune nouvelle t ache a et e lanc ee (mise ` a jour des
compteurs et du bool een shouldReply de BFTinfoTask).
1
2 /
**
Modification 9/07/2010 : task replication
**
/
3 //first, check if exists reduces that should be replicated.
This implies that reduces tasks are already launched
4 // in the cluster
5 int idtaskforreplic=this.bftmanager.
getIdReduceForReplication(tts);
6 if(idtaskforreplic ==-2)//block reduce task if all map
tasks are not finished
7 return -1;
8 if(idtaskforreplic!=-1){
9 return idtaskforreplic;
10 }
11 /
**********************************************
/
Listing 13 M ethode ndNewReduceTask de JobInprogress : Sch eduler les
r eplications
1 tip = findTaskFromList(nonRunningReduces, tts, numUniqueHosts,
false);
2 if (tip != null) {
3 scheduleReduce(tip);
4 /
**
Modification 9/07/2010 : task replication
**
/
5 //notify to bftmanager that a map has been scheduled for
the first time
6 this.bftmanager.taskLaunched(tip.getIdWithinJob(), tts,
false);
7 /
**********************************************
/
8 return tip.getIdWithinJob();
9 }
Listing 14 M ethode ndNewReduceTask de JobInprogress :Lancer la premi` ere
tentative
6.4.4 Au niveau des machines esclaves
Etant donn e quun nouvel etat DIGEST SENT a et e ajout e, il etait indispensable
de changer le code du Tasktracker ainsi que linterface RPC TaskUmbilicalProtocol
qui permet la communication entre les t aches et le Tasktracker. Nous avons rajout e la
m ethode digestSent qui permet de notier au Tasktracker que le child a bien envoy e ses
digests au JobTracker. La m ethode transmitHeartbeat a et e l eg erement modi ee apr es
la r eception du heartbeatResponse. Si l etat est ` a DIGEST SENT il ne faut pas enlever
de la liste runningTask la t ache en question.
1
2 heartbeatResponseId = heartbeatResponse.getResponseId();
3
4 synchronized (this) {
22
5 for (TaskStatus taskStatus : status.getTaskReports()) {
6 if (taskStatus.getRunState() != TaskStatus.State.
RUNNING &&
7 taskStatus.getRunState() != TaskStatus.State.
UNASSIGNED &&
8 /
***
Modification 9/07/2010 : task replication
***
*
/
9 taskStatus.getRunState() != TaskStatus.State.
DIGEST_SENT &&
10 /
*************************************************
*
/
11 taskStatus.getRunState() != TaskStatus.State.
COMMIT_PENDING &&
12 !taskStatus.inTaskCleanupPhase()) {
13 if (taskStatus.getIsMap()) {
14 mapTotal--;
15 } else {
16 reduceTotal--;
17 }
18 try {
19 myInstrumentation.completeTask(taskStatus.getTaskID
());
20 } catch (MetricsException me) {
21 LOG.warn("Caught: " + StringUtils.
stringifyException(me));
22 }
23 runningTasks.remove(taskStatus.getTaskID());
24 }
25 }
Listing 15 M ethode transmitHeartbeat de TaskTracker : Ne pas enlever de lensemble
des t aches en cours dex ecution celles qui sont DIGEST SENT
La classe abstraite Task qui mod elise une t ache ex ecutable sur un noeud esclave a
et e modi ee : un attribut entier qui stocke le port sur lequel ecoute le BFTmanager du
Job correspondant. Deux m ethodes ont et e ajout ees : la m ethode sendDigestToBFTma-
nager et la m ethode abstraite getDigest().
Les sous-classes MapTask et ReduceTask ont par cons equent et e modi ees. Lappel
` a la m ethode sendDigestToBFTmanager() a et e ajout ee ` a la n de chaque m ethode run
de ces classes. Il est a noter quun sleep a et e ajout e pour le cas des maps. En effet
nous endormons le thread un temps sup erieur ` a lintervalle de hearbeat (qui est par
d efaut de trois secondes) pour que le statut DIGEST SENT soit envoy e au JobTracker.
Si ce sleep etait absent, l etat passerai de DIGEST SENT ` a SUCCEEDED sans avoir
le temps de le transmettre via le heartbeat. Ce concept serait ` a am eliorer ` a terme.Une
solution qui pourrait eviter cela serait de modier la classe TaskTracker. Du code a d ej` a
et e ecrit pour cette solution mais na pas et e test e. Il est actuellement comment e dans
la classe Tasktracker entre des commentaires signal es par des etoiles et portant le tag
IMPROVE END MAP.
Les m ethodes write et readFields ont d u etre modi ees car nous avons ajout e des
attributs qui sont initialis es sur le Jobtracker et qui doivent transiter sur le r eseau tels
que le num ero de port du BFTmanager ou bien les digests des maps pour les reduces.
1 if (useNewApi) {
2 runNewMapper(job, split, umbilical, reporter);
23
3 } else {
4 runOldMapper(job, split, umbilical, reporter);
5 }
6 /
**
Modification 9/07/2010 : task replication
**
/
7 if(!this.isJobCleanupTask() && !this.isJobSetupTask() && !
this.isTaskCleanupTask()) {
8 sendDigestToBFTmanager(umbilical);
9 Thread.sleep(4000);
10 }
11 /
**********************************************
/
12 done(umbilical, reporter);
13 }
Listing 16 M ethode run de MapTask : envoi des digests
MapTask : Pour calculer les digests des diff erentes partitions, il a fallu ins erer du
code dans la m ethode mergeParts() de la classe interne MapOutput de MapTask.
Cette m ethode prend trois cas de gure pour g en erer le chier de sortie de map.
En effet le traitement est diff erent en fonction du nombre de chier de spill qui
ont et e cr e es pendant l ex ecution du map. Nous rappelons quun chier de spill
est un chier qui a et e cr e e par la t ache ` a chaque fois que son buffer a d epass e
un certain seuil de sa capacit e. Nous avons donc ins er e notre m ethode collectDi-
gest(Path indexFile, Path outputFile) trois fois. Les partitions sont cr e ees de la
mani` ere suivante. Il y a deux chiers : un chier de sortie contenant le r esultat et
un chier dindex. Ce chier dindex nest compos e que de long Java cod e sur
64 bits. Pour une partition, il y a trois long, le premier pour indiquer loffset dans
le chier du d ebut de la partition, le deuxi` eme pour indiquer la taille en octets
de la partition (d eplacement ` a partir de loffset), et le troisi` eme pour indiquer la
taille compress ee de la partition. Dans le chier dindex si nous devons diviser
le chier en p partitions nous avons donc 3p longs dans le chier dindex.
FIGURE 9 M ecanisme du chier dindex
Remarque : Entre chaque partition dans le chier nal, nous avons remarqu e
quil y avait un en-t ete de 4 octets entre chaque partition, do` u la pr esence de
la variable locale byte buftmp[] dans collectDigests. La m ethode getDigest de
MapTask renvoie juste un attribut propre ` a cette classe et qui est initialis e par la
m ethode collectDigest.
24
ReduceTask : Le ReduceCopier a bien entendu et e modi e. Premi` ere modica-
tion : Prise en compte de l etat DIGEST SENT dans le GetMapEventsThread. Le
traitement ` a faire pour cet etat est exactement le m eme que pour l etat SUCCEE-
DED. Ceci permet de t el echarger les r esultats de plusieurs r eplications dune
m eme map, ce qui etait impossible initialement.
Deuxi` eme modication : le contr ole des digests lors de la r ecup eration dune
partition : m ethode copyOutput du thread MapOutputCopier.
Un test au d ebut de cette fonction a et e ajout e. Il permet d eviter la copie si toutes
les sortie des maps ont et e recues et d eclar ees valides.
1 // check if we still need to copy the output from this
location
2 /
****
Modification 9/07/2010 : task replication
*******
/
3 boolean allreceived;
4 synchronized (digestsReceived) {
5 allreceived=(NumMapReceived==digestsReceived.
length);
6 }
7 if ((copiedMapOutputs.contains(loc.getTaskId()) ||
8 obsoleteMapIds.contains(loc.
getTaskAttemptId()))
9 && allreceived ) {
10 return CopyResult.OBSOLETE;
11 }
12 /
****************************************
/
13
14
15 /
***
16 OLD INSTRUCTIONS
17
18 if (copiedMapOutputs.contains(loc.getTaskId()) ||
19 obsoleteMapIds.contains(loc.getTaskAttemptId())
20 ) {
21 return CopyResult.OBSOLETE;
22 }
23
**
/
Listing 17 M ethode copyOutput de ReduceTask.ReduceCopier.MapOutputCopier :
Rajout du test tout recu
1 /
**********
Modification 9/07/2010 : task replication
*************
/
2
3
4
5 try {
6
7 int MapidInJob=loc.taskId.getId();
8
9 String StringDigest ="";
10 if(mapOutput.inMemory){
11 StringDigest = DigestTool.getDigest(mapOutput.
data);
25
12 }else{
13 StringDigest = DigestTool.getDigest(localFileSys,
mapOutput.file);
14 }
15
16 if(!ReduceTask.this.Mapdigests[MapidInJob].equals(
StringDigest)){
17 LOG.info("Byzantine fault suspected from map "+loc.
taskAttemptId+
18 StringDigest+" not equals "+ReduceTask.this.
Mapdigests[MapidInJob]);
19 return CopyResult.OBSOLETE;
20 }else{
21 boolean neverseen;
22 synchronized (digestsReceived) {
23 neverseen=digestsReceived[MapidInJob].equals("")
;
24 if( neverseen){
25 digestsReceived[MapidInJob]=StringDigest;
26 NumMapReceived++;
27 }
28 }
29 if(!neverseen)
30 return CopyResult.OBSOLETE;
31 }
32 } catch (NoSuchAlgorithmException e) {
33 e.printStackTrace();
34 }
35
36
37
38
39 /
************************************
/
Listing 18 M ethode copyOutput de ReduceTask.ReduceCopier.MapOutputCopier :
Contr ole de la coh erence des digests
La n des reduces est identique ` a celle des maps sauf que le calcul du digest se
fait directement sur des chiers pr esents sur le HDFS dans le r epertoire tempo-
raire. Les reduces qui ne commiteront pas seront tu ees.
26
7 Perspectives
7.1 Injections de pannes
7.1.1 Th eorie
Linjection de pannes na pas et e impl ement ee mais lid ee est la suivante :
Pouvoir choisir d` es le d epart une ou plusieurs t ache(s) fautive(s). On peut vouloir choi-
sir dinjecter des pannes au niveau des t aches de map ou de reduce.
Une t ache d eclar ee comme fautive va,par exemple, au moment du calcul de l ecriture
de sa sortie faire un d ecalage de bit et donc renvoyer un r esultat incoh erent qui sera
percu au moment de la comparaison des digests. Cest une id ee de panne mais il pour-
rait y en avoir dautres (erreur sur le calcul du digest, etc)
7.1.2 Suggestion dimpl ementation
Une mani` ere assez simple pour choisir le num ero de la t ache d efaillante serait duti-
liser les chiers de conguration. En effet dans le chier $HADOOP HOME/conf/mapred-
site.xml on peut d enir certaines sp ecicit es du MapReduce : nombre de t aches de re-
duce, nombre de t aches max,... On pourrait donc se servir de ce m eme chier et cr eer
des nouvelles properties : num ero des t aches de map ou de reduce fautives. En
d enissant par exemple la property suivante :
<property>
<name>mapred.reduce.taskID BF</name>
<value>5</value>
</property>
On indique ici que la t ache de reduce num ero 5 sera fautive.
Dans le code Java on peut r ecuperer ces informations de la mani` ere suivante : int nu-
mID BF=conf.getInt( mapred.reduce.taskID BF ,1) ce qui signie que si la valeur
nest pas d enie elle est par d efaut ` a 1.
On doit aussi choisir parmis les r eplications dune t ache, laquelle va commettre la
panne. On peut le d ecider avec une propri et e comme pr ecedemment ou arbitrairement
(toujours la premi` ere, la deuxi` eme, ...).
Au moment de l ecriture ou lors du calcul du digest (selon le type de pannes choi-
sies) la t ache doit g en erer une erreur si son taskID et son taskAttemptID correspondent
` a ceux indiqu es dans les congurations.
27
8 Annexes
8.1 Les schedulers
8.1.1 JobQueueTaskScheduler
Ce scheduler va assigner des t aches selon une politique FIFO avec priorit e. Il utilise
la m ethode suivante :
public synchronized List <Task> assignTasks(TaskTrackerStatus taskTracker)
Lors dun heartbeat provenant dun taskTracker, la m ethode assignTasks du scheduler
va etre appel ee pour savoir combien de t aches vont pouvoir etre attribu ees au taskTra-
cker ` a lorigine du heartBeat.
Cette m ethode suit la d emarche (politique) suivante :
Alloue dans un premier temps les t aches de map puis les t aches de reduce pour
lensemble des jobs.
Les jobs sont trait es par ordre darriv ee
Un job est trait e si et seulement si son pr edecesseur la et e.
On assigne des t aches ` a un taskTracker seulement si ce dernier en a la capacit e
et sil na pas atteint le nombre max de t aches quil doit g erer.
Cependant si le cluster tout entier tend ` a etre trop charg e (par exemple : plus assez
de place pour cr eer des r eplications d ues ` a lex ecution sp eculative), seulement les
t aches provenant de jobs ` a haute priorit e seront ordonnanc ees.
Une s erie de calculs va etre effectu ee pour calculer le nombre de slots libres sur
le taskTracker, donc combien de t aches il va pouvoir lui assigner. Une synth` ese de ces
calculs est pr esent ee ci-dessous pour lattribution des t aches de map.
Voici les diff erents param etres des calcul :
nbJob : le nombre total de jobs en cours sur le cluster.
nbMapDesired(i) : le nombre de maps d eni ` a la cr eation du job i (cest une
constante).
nbMapFinished(i) : le nombre de maps, pour le job i, qui se sont bien termin ees
( etat SUCCEDED).
remainingMapLoad : pour tous les jobs, le nombre de t aches de map encore en
cours (running + pending) sur le cluster.
remainingMapLoad =
nbJob
i=0
(nbMapDesired(i) nbMapFinished(i))
clusterMapCapacity : le nombre max de t aches de map qui peuvent etre lanc ees
sur tout le cluster. Ce param etre d epend de la capacit e de tous les taskTrackers et
est recalcul e dynamiquement lorsquun taskTracker red emarre ou devient black-
listed.
mapLoadFactor : facteur repr esentant le taux de chargement du cluster (pour les
t aches de map).
28
mapLoadFactor =
remainingMapLoad
clusterMapCapacity
trackerMapCapacity : le nombre maximal de t aches de map que peut g erer un
taskTacker (param etre d eni dans les congurations du syst` eme sous le nom :
mapred.tasktracker.map.tasks.maximum).
trackerCurrentMapCapacity : capacit e courante du taskTracker en fonction de la
charge du cluster et de sa capacit e d enie dans les congurations (trackerMap-
Capacity). Si le cluster est charg e ` a 50% on ne va pas charger ` a plus de 50% le
taskTracker.
trackerCurrentMapCapacity = min(mapLoadFactor trackerMapCapacity ,
maxMapTasks)
trackerRunningMaps : le nombre de t aches de map qui sont actuellement en
cours sur le taskTracker
availableMapSlots : le nombre de slots libres sur le taskTracker pour des t aches
de map. Si la capacit e du taskTracker (trackerMapCapacity) a et e d enie ` a 10 et
que la charge du cluster est de 50%, alors la capacit e courante du taskTracker est
de 5. Si il y avait d ej` a 2 t aches assign ees au taskTracker alors il a (5-2) = 3 slots
disponibles.
availableMapSlots = trackerCurrentMapCapacity trackerRunningMaps
Si le taskTracker a des slots libres, on va pouvoir lui attribuer des t aches de map
(autant que de slots libres). Cest donc une liste de t aches ` a lancer qui va etre transmise
au taskTracker via la r eponse du heartBeat.
M emes calculs pour les reduces ` a une diff erence pr` es : au plus 1 t ache de reduce peut
etre assign ee.
29
8.1.2 LimitTaskPerJobTaskScheduler
Ce scheduler a pour r ole de limiter le nombre de t aches en cours pour un job au
moyen du param` etre de conguration :
mapred.jobtracker.scheduler.maxRunningTasksPerJob.
Comme pr ecedemment la m ethode assignTask de ce scheduler va etre appel e par un
taskTracker lors dun heartbeat et va renvoyer un liste de t aches de map et de reduce
que devra g erer le taskTracker.
Au sein de la m ethode assignTask, une autre m ethode va etre appel ee (getMaxMapAn-
dReduceLoad) pour calculer (de la m eme mani` ere que dans le scheduler pr ecedent) le
nombre de slots libres pour des t aches de map et de reduce (elle renvoie un tableau de
deux entiers correspondant ` a ces deux nombres de slots). Quelques diff erences sont ` a
noter :
Il est possible que plusieurs t aches de reduce soient renvoy ees ` a un taskTracker
(dans une m eme r eponse de hearbeat).
Ce scheduler ne prend pas en compte les eventuelles pannes des taskTracker : il
ny a pas de mise ` a jour de la capacit e du cluster ne fonction des taskTracker (ne
tient pas compte de la blacklist).
Comme pour le premier scheduler nous allons pr esenter les diff erents calculs effectu es
dans la m ethode getMaxMapAndReduceLoad pour savoir le nombre de slots libres pour
des t aches de map (le principe etant le m eme pour les t aches de reduce).
nbJob : le nombre total de jobs en cours sur le cluster.
nbMapDesired(i) : le nombre de maps d eni ` a la cr eation du job i (cest une
constante).
nbMapFinished(i) : le nombre de maps, pour le job i, qui se sont bien termin ees
( etat SUCCEDED)
neededMaps : pour tous les jobs, le nombre de t aches de map encore en cours
(running + pending) sur le cluster.
neededMaps =
nbJob
i=0
(nbMapDesired(i) nbMapFinished(i))
numTaskTrackers : le nombre de taskTrackers (tous m eme ceux qui sont balck-
listed) sur tout le cluster.
mapLoadFactor : facteur repr esentant le taux de chargement du cluster (pour les
t aches de map).
mapLoadFactor = min(maxMapTasks,
neededMaps
numTaskTrackers
)
Cest ce param` etre (mapLoadFactor) qui va etre renvoy e (de m eme pour les re-
duces).
Ensuite les t aches de map et de reduce sont allou ees en fonction de plusieurs
param` etres :
30
mapLoadFactor
reduceLoadFactor
maxTasksPerJob correspondant au param` etre de conguration :
mapred.jobtracker.scheduler.maxRunningTasksPerJob
Il ne faut jamais exc eder le nombre de t aches par job ainsi que la charge des
taskTrackers.
31
8.2 M etriques suppl ementaires
0
100
200
300
400
500
600
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
T
a
i
l
l
e
m
o
y
e
n
n
e
d
u
n
m
e
s
s
a
g
e
d
e
t
y
p
e
m
a
p
r
e
d
(
o
c
t
e
t
s
)
.
Taille moyenne dun message de type mapred en fonction de la taille dun split
Taille des donnees en entree: 989118464 octets
split: 4 M
236 maps
split: 8 M
118 maps
split: 12 M
79 maps
split: 16 M
59 maps
split: 24 M
40 maps
split: 32 M
30 maps
split: 48 M
20 maps
split: 64 M
15 maps
FIGURE 10 Taille moyenne dun message de type mapred
32
0
100
200
300
400
500
600
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
T
a
i
l
l
e
m
o
y
e
n
n
e
d
u
n
m
e
s
s
a
g
e
d
e
t
y
p
e
h
d
f
s
(
o
c
t
e
t
s
)
.
Taille moyenne dun message de type hdfs en fonction de la taille dun split
Taille des donnees en entree: 989118464 octets
split: 4 M
236 maps
split: 8 M
118 maps
split: 12 M
79 maps
split: 16 M
59 maps
split: 24 M
40 maps
split: 32 M
30 maps
split: 48 M
20 maps
split: 64 M
15 maps
FIGURE 11 Taille moyenne dun message de type hdfs
0
20
40
60
80
100
120
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
T
a
i
l
l
e
m
o
y
e
n
n
e
d
u
n
m
e
s
s
a
g
e
d
e
t
y
p
e
s
e
r
v
i
c
e
(
o
c
t
e
t
s
)
.
Taille moyenne dun message de type service en fonction de la taille dun split
Taille des donnees en entree: 989118464 octets
split: 4 M
236 maps
split: 8 M
118 maps
split: 12 M
79 maps
split: 16 M
59 maps
split: 24 M
40 maps
split: 32 M
30 maps
split: 48 M
20 maps
split: 64 M
15 maps
FIGURE 12 Taille moyenne dun message de type service
33
0
50
100
150
200
250
300
350
400
450
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
A
R
A
S
S
R
A
S
A
R
S
S
S
R
S
S
T
a
i
l
l
e
m
o
y
e
n
n
e
d
u
n
m
e
s
s
a
g
e
d
e
t
y
p
e
a
u
t
r
e
(
o
c
t
e
t
s
)
.
Taille moyenne dun message de type autre en fonction de la taille dun split
Taille des donnees en entree: 989118464 octets
split: 4 M
236 maps
split: 8 M
118 maps
split: 12 M
79 maps
split: 16 M
59 maps
split: 24 M
40 maps
split: 32 M
30 maps
split: 48 M
20 maps
split: 64 M
15 maps
FIGURE 13 Taille moyenne dun message de type autre
0
500000
1e+06
1.5e+06
2e+06
2.5e+06
3e+06
3.5e+06
4e+06
8 12 16 24 32 48 64
t
a
i
l
l
e
t
o
t
a
l
e
d
e
s
m
e
s
s
a
g
e
s
taille du split Mo
Ecart type taille (totale) des messages
Legend
ARAS
SRAS
SRAS
SRAS
FIGURE 14 Ecart-type taille des messages
34
0
1000
2000
3000
4000
5000
6000
7000
8000
8 12 16 24 32 48 64
n
o
m
b
r
e
d
e
m
e
s
s
a
g
e
s
taille du split Mo
Ecart type nombre de messages
Legend
ARAS
SRAS
SRAS
SRAS
FIGURE 15 Ecart-type nombres de messages
0
20000
40000
60000
80000
100000
120000
140000
160000
180000
200000
8 12 16 24 32 48 64
l
a
t
e
n
c
e
taille du split Mo
Ecart type latence du MapReduce
Legend
ARAS
SRAS
SRAS
SRAS
FIGURE 16 Ecart-type latence
35
0
5000
10000
15000
20000
25000
30000
35000
8 12 16 24 32 48 64
l
a
t
e
n
c
e
taille du split Mo
Ecart type latence Map
Legend
ARAS
SRAS
SRAS
SRAS
FIGURE 17 Ecart-type latence map
0
10000
20000
30000
40000
50000
60000
8 12 16 24 32 48 64
l
a
t
e
n
c
e
taille du split Mo
Ecart type latence Shuffle
Legend
ARAS
SRAS
SRAS
SRAS
FIGURE 18 Ecart-type latence reduce en phase Shufe
36
0
1000
2000
3000
4000
5000
6000
7000
8 12 16 24 32 48 64
l
a
t
e
n
c
e
taille du split Mo
Ecart type latence Sort
Legend
ARAS
SRAS
SRAS
SRAS
FIGURE 19 Ecart-type latence reduce en phase Sort
0
5000
10000
15000
20000
25000
30000
35000
40000
45000
8 12 16 24 32 48 64
l
a
t
e
n
c
e
taille du split Mo
Ecart type latence Reduce
Legend
ARAS
SRAS
SRAS
SRAS
FIGURE 20 Ecart-type latence reduce en phase Reduce
37