J'ai écrit un travail mapreduce pour extraire des informations d'un ensemble de données. L'ensemble de données est la note des utilisateurs sur les films. Le nombre d'utilisateurs est d'environ 250 000 et le nombre de films est d'environ 300 000. La sortie de la carte est <user, <movie, rating>*> and <movie,<user,rating>*>
. Dans le réducteur, je traiterai ces paires.
Mais lorsque j'exécute le travail, le mappeur se termine comme prévu, mais le réducteur se plaint toujours que
Task attempt_* failed to report status for 600 seconds.
Je sais que cela est dû à l'échec de la mise à jour de l'état, j'ai donc ajouté un appel à context.progress()
dans mon code comme ceci:
int count = 0;
while (values.hasNext()) {
if (count++ % 100 == 0) {
context.progress();
}
/*other code here*/
}
Malheureusement, cela n'aide pas. Beaucoup de tâches de réduction ont échoué.
Voici le journal:
Task attempt_201104251139_0295_r_000014_1 failed to report status for 600 seconds. Killing!
11/05/03 10:09:09 INFO mapred.JobClient: Task Id : attempt_201104251139_0295_r_000012_1, Status : FAILED
Task attempt_201104251139_0295_r_000012_1 failed to report status for 600 seconds. Killing!
11/05/03 10:09:09 INFO mapred.JobClient: Task Id : attempt_201104251139_0295_r_000006_1, Status : FAILED
Task attempt_201104251139_0295_r_000006_1 failed to report status for 600 seconds. Killing!
BTW, l'erreur s'est produite dans la phase de réduction à la copie, le journal indique:
reduce > copy (28 of 31 at 26.69 MB/s) > :Lost task tracker: tracker_hadoop-56:localhost/127.0.0.1:34385
Merci pour l'aide.
Le moyen le plus simple sera de définir ce paramètre de configuration:
<property>
<name>mapred.task.timeout</name>
<value>1800000</value> <!-- 30 minutes -->
</property>
dans mapred-site.xml
L'autre moyen le plus simple consiste à définir la configuration de votre travail dans le programme
Configuration conf=new Configuration();
long milliSeconds = 1000*60*60; <default is 600000, likewise can give any value)
conf.setLong("mapred.task.timeout", milliSeconds);
** avant de le définir, veuillez vérifier dans le fichier Job (job.xml) dans l'interface graphique de jobtracker le nom de propriété correct, qu'il s'agisse de mapred.task.timeout ou mapreduce.task.timeout. . . lors de l'exécution du travail, vérifiez à nouveau dans le fichier de travail si cette propriété est modifiée en fonction de la valeur définie.
Dans les versions plus récentes, le nom du paramètre a été changé en mapreduce.task.timeout
comme décrit dans ce lien (recherchez task.timeout
). De plus, vous pouvez également désactiver ce délai comme décrit dans le lien ci-dessus:
Le nombre de millisecondes avant qu'une tâche soit interrompue si elle ne lit pas une entrée, n'écrit pas de sortie ni ne met à jour sa chaîne d'état. Une valeur de 0 désactive le délai d'attente.
Voici un exemple de paramètre dans le mapred-site.xml
:
<property>
<name>mapreduce.task.timeout</name>
<value>0</value> <!-- A value of 0 disables the timeout -->
</property>
Si vous avez une requête Hive et son délai d'expiration, vous pouvez définir les configurations ci-dessus de la manière suivante:
définir mapred.tasktracker.expiry.interval = 1800000;
définissez mapred.task.timeout = 1800000;
De https://issues.Apache.org/jira/browse/HADOOP-176
les causes peuvent être:
1. Tasktrackers run the maps successfully
2. Map outputs are served by jetty servers on the TTs.
3. All the reduce tasks connects to all the TT where maps are run.
4. since there are lots of reduces wanting to connect the map output server, the jetty servers run out of threads (default 40)
5. tasktrackers continue to make periodic heartbeats to JT, so that they are not dead, but their jetty servers are (temporarily) down.