2011-09-05 22 views
6

Tôi đã đập đầu vào cái này trong một vài ngày và hy vọng rằng ai đó sẽ có một số thông tin chi tiết.Lỗi công việc phát trực tuyến Hadoop: Quá trình xử lý tác vụ với trạng thái không đồng bộ của 137

Tôi đã viết bản đồ phát trực tuyến làm giảm công việc trong perl dễ bị mất một hoặc hai tác vụ mất nhiều thời gian để thực thi. Điều này là do sự bất đối xứng tự nhiên trong dữ liệu: một số phím giảm có hơn một triệu hàng, trong đó hầu hết chỉ có vài chục.

Tôi đã gặp sự cố với các tác vụ dài trước đây và tôi đã tăng số lượt truy cập trong toàn bộ để đảm bảo rằng bản đồ giảm không mất thời gian. Nhưng bây giờ họ đang thất bại với một thông báo lỗi tôi đã không nhìn thấy trước đây:

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

Đây không phải là thông báo lỗi timeout tiêu chuẩn, nhưng các mã lỗi 137 = 128 + 9 gợi ý rằng kịch bản giảm của tôi nhận được một kill - 9 từ Hadoop. Nhật ký tác vụ chứa các thông tin sau:

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) 

Tôi đã tìm kiếm các diễn đàn và có vẻ như Cảnh báo thường được tìm thấy trong các công việc chạy mà không có lỗi và thường có thể bỏ qua. Lỗi làm cho nó trông giống như giảm liên lạc bị mất với đầu ra bản đồ, nhưng tôi không thể hiểu tại sao. Có ai có ý tưởng nào?

Dưới đây là một thực tế có khả năng có liên quan: Các tác vụ dài này đã khiến công việc của tôi mất nhiều ngày để mất vài phút. Kể từ khi tôi có thể sống mà không có đầu ra từ một hoặc hai phím, tôi cố gắng thực hiện một thời gian chờ mười phút trong giảm tốc của tôi như sau:

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

thời gian chờ này hoạt động như một nét duyên dáng khi tôi kiểm tra kịch bản tại địa phương, nhưng lỗi mapreduce lạ bắt đầu sau khi tôi giới thiệu nó. Tuy nhiên, những thất bại dường như xảy ra sau thời gian chờ đầu tiên, vì vậy tôi không chắc liệu nó có liên quan hay không.

Cảm ơn trước sự giúp đỡ nào!

+0

Tôi quên đề cập đến, tôi đang sử dụng hadoop 0.20.2. –

Trả lời

10

Hai khả năng tôi suy nghĩ:

  1. sử dụng RAM, nếu một nhiệm vụ sử dụng quá nhiều RAM hệ điều hành có thể giết nó (sau khi trao đổi khủng khiếp, vv).
  2. Bạn có đang sử dụng bất kỳ thư viện nào không phải là thư viện không? Có thể bộ hẹn giờ đang được kích hoạt tại một điểm không thích hợp trong một cuộc gọi thư viện.
+0

Bạn có thể plz xây dựng trên một thứ hai ('không reentrant')? – Alcott

+0

Trước hết tôi sẽ kiểm tra gợi ý đầu tiên (kẻ giết người Linux OOM), bởi vì mã trả về 137 là chữ ký của nó (128 + 9 cho SIG_KILL). Nó là khá thẳng về phía trước để xác định xem bạn có bị ảnh hưởng bởi điều kiện này: egrep -i 'quá trình bị giết'/var/log/messages, cũng được phát triển trong câu trả lời này: http://stackoverflow.com/a/624868/366749 –

+0

Rất tiếc - đã bỏ lỡ nhận xét này. Một số thư viện (chúng tôi đã có vấn đề với thư viện auth của Quest một vài năm trước đây) không phải là đa luồng tương thích và nếu họ hạt nhân nhiệm vụ chuyển mạch trong khi họ đang hoạt động "những điều xấu xảy ra". – cftarnas

5

Mã thoát 137 là dấu hiệu điển hình của kẻ giết người OOM khét tiếng. Bạn có thể dễ dàng kiểm tra nó bằng cách sử dmesg lệnh cho các tin nhắn như thế này:

[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 

Bạn có thể dễ dàng nếu oom được kích hoạt:

$ cat /proc/sys/vm/overcommit_memory 
0 

Về cơ bản oom killer cố gắng để giết quá trình đó ăn phần lớn nhất của bộ nhớ. Và bạn probably don't want to disable it:

Kẻ giết người OOM có thể bị tắt hoàn toàn bằng lệnh sau. Điều này không được khuyến cáo cho môi trường sản xuất, bởi vì nếu một điều kiện ngoài bộ nhớ hiện diện, có thể xảy ra hành vi không mong muốn tùy thuộc vào tài nguyên hệ thống có sẵn và cấu hình .Hành vi không mong muốn này có thể là bất kỳ điều gì từ sự hoảng loạn hạt nhân đến mức tùy thuộc vào tài nguyên có sẵn cho hạt nhân tại thời điểm điều kiện OOM.

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

Tình huống tương tự có thể xảy ra nếu bạn sử dụng ví dụ: cgroups để hạn chế bộ nhớ. Khi quá trình vượt quá giới hạn cho phép, nó sẽ bị giết mà không cần cảnh báo.

0

Tôi gặp lỗi này. Giết một ngày và thấy nó là một vòng lặp vô hạn đâu đó trong mã.

Các vấn đề liên quan