Hadoop streaming échec de la tâche: la Tâche du processus de sortie différent de zéro statut de 137
J'ai été frapper ma tête sur celui-ci pendant quelques jours, et espère que quelqu'un parmi vous ont une idée.
J'ai écrit un streaming carte de réduire l'emploi en perl, qui est enclin à avoir un ou deux de réduire les tâches de prendre un temps extrêmement long à exécuter. Cela est dû à une asymétrie naturelle dans les données: certaines réduire les touches disposent de plus d'un million de lignes, où la plupart ont seulement quelques dizaines de.
J'ai eu des problèmes avec de longues tâches à accomplir avant, et j'ai été l'incrémentation des compteurs partout pour s'assurer que la carte de réduire n'a pas le temps de l'en sortir. Mais maintenant, elles ne sont pas avec un message d'erreur que je n'avais pas vu avant:
java.io.IOException: Task process exit with nonzero status of 137.
at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:418)
Ce n'est pas le délai standard de message d'erreur, mais le code d'erreur 137 = 128+9 suggère que mes réducteur script a reçu un kill -9 Hadoop. Le tasktracker journal contient les éléments suivants:
2011-09-05 19:18:31,269 WARN org.mortbay.log: Committed before 410 getMapOutput(attempt_201109051336_0003_m_000029_1,7) failed :
org.mortbay.jetty.EofException
at org.mortbay.jetty.HttpGenerator.flush(HttpGenerator.java:787)
at org.mortbay.jetty.AbstractGenerator$Output.blockForOutput(AbstractGenerator.java:548)
at org.mortbay.jetty.AbstractGenerator$Output.flush(AbstractGenerator.java:569)
at org.mortbay.jetty.HttpConnection$Output.flush(HttpConnection.java:946)
at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:646)
at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:577)
at org.apache.hadoop.mapred.TaskTracker$MapOutputServlet.doGet(TaskTracker.java:2940)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:502)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:363)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417)
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:324)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:534)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:864)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:533)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:207)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:403)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:522)
Caused by: java.io.IOException: Connection reset by peer
at sun.nio.ch.FileDispatcher.write0(Native Method)
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:29)
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:72)
at sun.nio.ch.IOUtil.write(IOUtil.java:43)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:334)
at org.mortbay.io.nio.ChannelEndPoint.flush(ChannelEndPoint.java:169)
at org.mortbay.io.nio.SelectChannelEndPoint.flush(SelectChannelEndPoint.java:221)
at org.mortbay.jetty.HttpGenerator.flush(HttpGenerator.java:721)
... 24 more
2011-09-05 19:18:31,289 INFO org.apache.hadoop.mapred.TaskTracker.clienttrace: src: 10.92.8.202:50060, dest: 10.92.8.201:46436, bytes: 7340032, op: MAPRED_SHUFFLE, cliID: attempt_201109051336_0003_m_000029_1
2011-09-05 19:18:31,292 ERROR org.mortbay.log: /mapOutput
java.lang.IllegalStateException: Committed
at org.mortbay.jetty.Response.resetBuffer(Response.java:994)
at org.mortbay.jetty.Response.sendError(Response.java:240)
at org.apache.hadoop.mapred.TaskTracker$MapOutputServlet.doGet(TaskTracker.java:2963)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:502)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:363)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417)
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:324)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:534)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:864)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:533)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:207)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:403)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:522)
J'ai été en regardant autour de forums, et il semble que les mises en garde sont généralement trouvés dans les travaux qui s'exécutent sans erreur, et peuvent généralement être ignoré. L'erreur de fait ressembler le réducteur de perte de contact avec la carte de sortie, mais je ne peux pas comprendre pourquoi. Quelqu'un a une idée?
Voici potentiellement un fait important: Ces tâches étaient de faire mon travail de prendre des jours où il devrait prendre quelques minutes. Puisque je ne peux vivre sans la sortie d'un ou deux touches, j'ai essayé de mettre en œuvre une dizaine de minutes de délai d'attente dans mon réducteur comme suit:
eval {
local $SIG{ALRM} = sub {
print STDERR "Processing of new merchant names in $prev_merchant_zip timed out...\n";
print STDERR "reporter:counter:tags,failed_zips,1\n";
die "timeout";
};
alarm 600;
#Code that could take a long time to execute
alarm 0;
};
Ce délai le code fonctionne comme un charme quand j'ai tester le script en local, mais l'étrange mapreduce erreurs a commencé après que j'ai présenté il. Pourtant, les échecs semblent se produire bien après le premier délai d'attente, donc je ne sais pas si c'est lié.
Merci d'avance pour toute aide!
- J'ai oublié de mentionner, je suis en utilisant hadoop 0.20.2.
Vous devez vous connecter pour publier un commentaire.
Deux possibilités viennent à l'esprit:
non-reentrant
)?Code de sortie 137 est un signe typique de l'infâme OOM killer. Vous pouvez facilement vérifier à l'aide de
dmesg
de commande pour les messages comme ceci:Vous pouvez facilement si OOM est activé:
Fondamentalement OOM killer tente de tuer les processus qui se nourrit de la plus grande partie de la mémoire. Et vous ne voulez probablement pas à le désactiver:
Même situation peut se produire si vous utilisez par exemple
cgroups
pour la limitation de la mémoire. Lorsque le processus dépasse la limite il se fait tuer sans avertissement.J'ai eu cette erreur. Tuer un jour et a trouvé que c'était une boucle infinie, quelque part dans le code.