Streaming Hadoop流作业失败:任务进程退出,非零状态为137

Streaming Hadoop流作业失败:任务进程退出,非零状态为137,streaming,hadoop,Streaming,Hadoop,这件事我已经讨论了好几天了,希望有人能有所了解 我用perl编写了一个streaming map reduce作业,它很容易让一两个reduce任务花费很长时间来执行。这是由于数据中的自然不对称:一些reduce键有超过一百万行,而大多数只有几十行 我以前遇到过长时间任务的问题,我一直在增加计数器,以确保map reduce不会使它们超时。但现在他们失败了,出现了一条我以前从未见过的错误消息: java.io.IOException: Task process exit with nonzero

这件事我已经讨论了好几天了,希望有人能有所了解

我用perl编写了一个streaming map 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中实现十分钟超时,如下所示:

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错误是在我引入它之后开始的。然而,故障似乎在第一次超时之后就发生了,所以我不确定这是否相关


提前感谢您的帮助

我想到了两种可能性:

  • RAM使用,如果一个任务使用了太多的RAM,操作系统可能会杀死它(在可怕的交换之后,等等)
  • 您是否使用任何不可重入的库?在库调用中,计时器可能在不合适的点触发

  • 出口代码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 killer试图杀死占用大部分内存的进程。而你:

    可以使用以下命令完全禁用OOM killer。 这不建议用于生产环境,因为如果 内存不足的情况确实会出现,可能会出现意外情况 行为取决于可用的系统资源和 配置这种意外的行为可能是由于 内核死机到挂起,这取决于内核可用的资源 出现OOM条件时的内核


    如果使用例如
    cgroups
    来限制内存,同样的情况也会发生。当进程超过给定的限制时,它会在没有警告的情况下被终止。

    我遇到了这个错误。消磨一天,发现代码中的某个地方有一个无限循环

    我忘了提到,我正在使用hadoop 0.20.2。你能不能在第二个(
    不可重入(/code>)?我会首先检查第一个建议(Linux OOM killer),因为返回代码137是它的签名(对于SIG_KILL是128+9)。确定您是否受到这种情况的影响是相当直接的:egrep-i“killed process”/var/log/messages,也是在这个答案中开发的:抱歉-错过了这个评论。一些库(几年前我们在Quest的auth库中遇到了问题)不兼容多线程,如果它们在内核任务处于活动状态时切换,那么“坏事情就会发生”。
    
    $ cat /proc/sys/vm/overcommit_memory
    0
    
    sysctl vm.overcommit_memory=2
    echo "vm.overcommit_memory=2" >> /etc/sysctl.conf