Hadoop流式传输失败:任务进程退出,非零状态为137

时间:2011-09-05 19:40:51

标签: streaming hadoop

我已经在这个问题上敲了几天,希望那里的人会有一些见解。

我在perl中编写了一个流映射reduce工作,这个工作很容易让一个或两个reduce任务需要很长时间才能执行。这是由于数据中的自然不对称:一些reduce键有超过一百万行,其中大多数只有几十行。

我以前遇到过长任务的问题,而且我一直在递增计数器,以确保map reduce不会将它们计时。但是现在他们失败了,我之前没有看到过错误消息:

java.io.IOException: Task process exit with nonzero status of 137.
    at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:418)

这不是标准的超时错误消息,但错误代码137 = 128 + 9表明我的reducer脚本从Hadoop收到了kill -9。 tasktracker日志包含以下内容:

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)

我一直在寻找论坛,听起来警告通常在没有错误运行的作业中找到,通常可以忽略。该错误使得它看起来像reducer与地图输出失去联系,但我无法弄清楚原因。有没有人有任何想法?

这是一个可能相关的事实:这些长期任务使我的工作需要几天才能完成。由于我可以在没有一个或两个键的输出的情况下生活,我尝试在我的reducer中实现十分钟超时,如下所示:

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;
    };

当我在本地测试脚本时,这个超时代码就像一个魅力,但在我介绍它之后,奇怪的mapreduce错误就开始了。但是,失败似乎在第一次超时后发生,所以我不确定它是否相关。

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:10)

有两种可能性浮现在脑海中:

  1. RAM的使用,如果一个任务使用太多的RAM,操作系统可以杀死它(在可怕的交换之后等)。
  2. 您使用的是非重入库吗?也许计时器是在库调用中的不合适点触发的。

答案 1 :(得分:5)

退出代码137是臭名昭着的OOM杀手的典型标志。您可以使用dmesg命令轻松检查此类消息:

[2094250.428153] CPU: 23 PID: 28108 Comm: node Tainted: G         C O  3.16.0-4-amd64 #1 Debian 3.16.7-ckt20-1+deb8u2
[2094250.428155] Hardware name: Supermicro X9DRi-LN4+/X9DR3-LN4+/X9DRi-LN4+/X9DR3-LN4+, BIOS 3.2 03/04/2015
[2094250.428156]  ffff880773439400 ffffffff8150dacf ffff881328ea32f0 ffffffff8150b6e7
[2094250.428159]  ffff881328ea3808 0000000100000000 ffff88202cb30080 ffff881328ea32f0
[2094250.428162]  ffff88107fdf2f00 ffff88202cb30080 ffff88202cb30080 ffff881328ea32f0
[2094250.428164] Call Trace:
[2094250.428174]  [<ffffffff8150dacf>] ? dump_stack+0x41/0x51
[2094250.428177]  [<ffffffff8150b6e7>] ? dump_header+0x76/0x1e8
[2094250.428183]  [<ffffffff8114044d>] ? find_lock_task_mm+0x3d/0x90
[2094250.428186]  [<ffffffff8114088d>] ? oom_kill_process+0x21d/0x370
[2094250.428188]  [<ffffffff8114044d>] ? find_lock_task_mm+0x3d/0x90
[2094250.428193]  [<ffffffff811a053a>] ? mem_cgroup_oom_synchronize+0x52a/0x590
[2094250.428195]  [<ffffffff8119fac0>] ? mem_cgroup_try_charge_mm+0xa0/0xa0
[2094250.428199]  [<ffffffff81141040>] ? pagefault_out_of_memory+0x10/0x80
[2094250.428203]  [<ffffffff81057505>] ? __do_page_fault+0x3c5/0x4f0
[2094250.428208]  [<ffffffff8109d017>] ? put_prev_entity+0x57/0x350
[2094250.428211]  [<ffffffff8109be86>] ? set_next_entity+0x56/0x70
[2094250.428214]  [<ffffffff810a2c61>] ? pick_next_task_fair+0x6e1/0x820
[2094250.428219]  [<ffffffff810115dc>] ? __switch_to+0x15c/0x570
[2094250.428222]  [<ffffffff81515ce8>] ? page_fault+0x28/0x30

如果启用了OOM,您可以轻松完成:

$ cat /proc/sys/vm/overcommit_memory
0

基本上,OOM杀手试图杀死占据大部分内存的进程。而你probably don't want to disable it

  

可以使用以下命令完全禁用OOM杀手。   建议不要将其用于生产环境,因为如果是   内存不足的情况确实存在,可能出乎意料   行为取决于可用的系统资源和   组态。这种意想不到的行为可能来自于   内核恐慌到挂起取决于可用的资源   OOM条件时的内核。

sysctl vm.overcommit_memory=2
echo "vm.overcommit_memory=2" >> /etc/sysctl.conf

如果您使用例如,可能会发生同样的情况cgroups用于限制记忆。当进程超过给定限制时,它会在没有警告的情况下被杀死。

答案 2 :(得分:0)

我收到了这个错误。杀了一天,发现它在代码中的某个地方是一个无限循环。