2011-05-03 38 views
24

Tôi đã viết một công việc Mapreduce để trích xuất một số thông tin từ tập dữ liệu. Tập dữ liệu là xếp hạng của người dùng về phim. Số lượng người dùng khoảng 250K và số lượng phim là khoảng 300k. Đầu ra của bản đồ là <user, <movie, rating>*> and <movie,<user,rating>*>. Trong bộ giảm tốc, tôi sẽ xử lý các cặp này.Cách khắc phục "Tác vụ try_201104251139_0295_r_000006_0 không thể báo cáo trạng thái trong 600 giây".

Nhưng khi tôi chạy các công việc, các mapper hoàn thành như mong đợi, nhưng giảm tốc luôn luôn phàn nàn rằng

Task attempt_* failed to report status for 600 seconds. 

Tôi biết điều này là do thất bại trong việc cập nhật trạng thái, vì vậy tôi thêm một cuộc gọi đến context.progress() trong mã của tôi như thế này:

int count = 0; 
while (values.hasNext()) { 
    if (count++ % 100 == 0) { 
    context.progress(); 
    } 
    /*other code here*/ 
} 

Thật không may, điều này không hữu ích. Vẫn còn nhiều nhiệm vụ giảm thất bại.

Đây là nhật ký:

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, các lỗi xảy ra trong giảm để sao chép giai đoạn, nhật ký nói:

reduce > copy (28 of 31 at 26.69 MB/s) > :Lost task tracker: tracker_hadoop-56:localhost/127.0.0.1:34385 

Thanks for the help.

+0

Bạn có thể xem xét việc ban hành context.progress() gọi hơn thường xuyên. Mã của bạn nên hoạt động miễn là thời gian giữa các lệnh gọi context.progress() không vượt quá giới hạn (600 giây trong cấu hình của bạn). – cabad

Trả lời

26

Cách đơn giản nhất sẽ được để thiết lập thông số cấu hình này:

<property> 
    <name>mapred.task.timeout</name> 
    <value>1800000</value> <!-- 30 minutes --> 
</property> 

trong mapred-site.xml

+0

Cảm ơn bạn đã ans. Tuy nhiên tôi không chắc chắn về một điều. Nhật ký cho biết "reduce> copy (28 của 31 ở 26,69 MB/giây)>: Trình theo dõi tác vụ bị mất: tracker_hadoop-56: localhost/127.0.0.1: 34385". Điều đó có nghĩa là gì? – user572138

+0

Haha, yeah đó là cố định arround vấn đề. Điều này nói rằng, tasktracker của bạn đã biến mất/bị hỏng. Đó có thể là những vấn đề khác nhau. Có một cái nhìn vào các bản ghi. Tôi giả định rằng các bộ mô tả tệp của bạn đã làm trống. –

+1

Đây không thực sự là một sửa chữa. Đây là một công việc xung quanh sẽ chạy vào cùng một vấn đề nếu nhiệm vụ được mở rộng. –

15

Các dễ nhất cách khác là để thiết lập trong cấu hình Job của bạn bên trong chương trình

Configuration conf=new Configuration(); 
long milliSeconds = 1000*60*60; <default is 600000, likewise can give any value) 
conf.setLong("mapred.task.timeout", milliSeconds); 

* * trước khi cài đặt, vui lòng kiểm tra bên trong tệp Job (tệp job.xml) trong GUI trình theo dõi công việc về tên thuộc tính chính xác cho dù đó là mapred.task.timeout hoặc mapreduce.task.tim eout . . . trong khi chạy kiểm tra công việc trong tệp công việc một lần nữa cho dù thuộc tính đó được thay đổi theo giá trị đã đặt.

+0

Cách tiếp cận này có lẽ tốt hơn, vì bạn có thể muốn công việc thường xuyên của bạn hết thời gian chờ trong 10 phút. Cấu hình các nhu cầu đặc biệt khi cần thiết và không phải trong trường hợp chung. –

3

Nếu bạn có truy vấn hive và thời gian của nó ra, bạn có thể thiết lập cấu hình ở trên theo cách sau:

bộ mapred.tasktracker.expiry.interval = 1800000;

đặt mapred.task.timeout = 1800000;

11

Trong các phiên bản mới hơn, tên của tham số đã được đổi thành mapreduce.task.timeout như được mô tả trong số link này (tìm kiếm task.timeout). Bên cạnh đó, bạn cũng có thể vô hiệu hóa thời gian chờ này như mô tả trong các liên kết ở trên:

Số mili giây trước khi một nhiệm vụ sẽ được chấm dứt nếu nó không đọc một đầu vào, viết một đầu ra, cũng không cập nhật chuỗi tình trạng của nó . Giá trị 0 sẽ tắt thời gian chờ.

Dưới đây là một ví dụ thiết lập trong mapred-site.xml:

<property> 
    <name>mapreduce.task.timeout</name> 
    <value>0</value> <!-- A value of 0 disables the timeout --> 
</property> 
1

Từ https://issues.apache.org/jira/browse/HADOOP-1763

nguyên nhân có thể là:

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. 
Các vấn đề liên quan