2012-06-13 36 views
6

Tôi đang viết một công việc MapReduce có thể kết thúc với một số lượng lớn các giá trị trong bộ giảm tốc. Tôi lo lắng về tất cả các giá trị này đang được nạp vào bộ nhớ cùng một lúc.Giá trị giảm tốc của Hadoop trong bộ nhớ?

Việc triển khai cơ bản của các giá trị tải Iterable<VALUEIN> values vào bộ nhớ khi chúng cần thiết? Hadoop: Hướng dẫn dứt khoát dường như cho thấy đây là trường hợp, nhưng không đưa ra câu trả lời "dứt khoát".

Đầu ra giảm sẽ lớn hơn nhiều so với đầu vào giá trị, nhưng tôi tin rằng đầu ra được ghi vào đĩa nếu cần.

Trả lời

12

Bạn đang đọc sách chính xác. Bộ giảm tốc không lưu trữ tất cả các giá trị trong bộ nhớ. Thay vào đó, khi lặp qua danh sách giá trị Iterable, mỗi cá thể Object được sử dụng lại, vì vậy nó chỉ giữ một cá thể xung quanh tại một thời điểm nhất định.

Ví dụ trong mã tiếp theo, các objs ArrayList sẽ có kích thước dự kiến ​​sau vòng lặp nhưng mọi phần tử sẽ giống nhau b/c dụ Val văn bản được sử dụng lại mỗi lần lặp.

public static class ReducerExample extends Reducer<Text, Text, Text, Text> { 
public void reduce(Text key, Iterable<Text> values, Context context) { 
    ArrayList<Text> objs = new ArrayList<Text>(); 
      for (Text val : values){ 
        objs.add(val); 
      } 
    } 
} 

(Nếu vì một số lý do bạn không muốn có thêm hành động trên mỗi val, bạn nên tạo một bản sao sâu và sau đó lưu nó.)

Dĩ nhiên ngay cả một giá trị duy nhất có thể lớn hơn bộ nhớ . Trong trường hợp này, nhà phát triển nên thực hiện các bước để giảm bớt dữ liệu trong Mapper trước để giá trị không quá lớn.

CẬP NHẬT: Xem trang 199-200 của Hadoop Hướng dẫn dứt khoát 2nd Edition.

This code snippet makes it clear that the same key and value objects are used on each 
invocation of the map() method -- only their contents are changed (by the reader's 
next() method). This can be a surprise to users, who might expect keys and vales to be 
immutable. This causes prolems when a reference to a key or value object is retained 
outside the map() method, as its value can change without warning. If you need to do 
this, make a copy of the object you want to hold on to. For example, for a Text object, 
you can use its copy constructor: new Text(value). 

The situation is similar with reducers. In this case, the value object in the reducer's 
iterator are reused, so you need to copy any that you need to retain between calls to 
the iterator. 
+0

Tôi bị nhầm lẫn với câu trả lời của bạn. Đầu tiên bạn nói, "bộ giảm tốc không lưu trữ tất cả các giá trị trong bộ nhớ", điều này ngụ ý rằng các giá trị tải Iterable khi cần thiết. Sau đó, bạn nói, "thậm chí một danh sách giá trị duy nhất có thể lớn hơn bộ nhớ", ngụ ý rằng danh sách các giá trị được nạp lần đầu tiên vào bộ nhớ. Bạn có thể làm rõ? – Zach

+0

Đã chỉnh sửa để làm rõ. Tôi chỉ có nghĩa là ngay cả một giá trị duy nhất có thể lớn. Điều này là không thể. "Bộ giảm tốc không lưu trữ tất cả các giá trị trong bộ nhớ" là một câu lệnh đúng. Điều đó có ý nghĩa? –

+0

Có. Cảm ơn bạn đã làm rõ. Bạn có một tham chiếu cho điều này, tình cờ? – Zach

2

Nó không hoàn toàn trong bộ nhớ, một số từ đĩa, xem mã có vẻ như khung phá vỡ Iterable thành phân đoạn và tải chúng vào đĩa bộ nhớ 1.

org.apache.hadoop.mapreduce.task.ReduceContextImpl org.apache.hadoop.mapred.BackupStore

+0

Bạn có thể giải thích cách giải quyết vấn đề này không? –

0

Theo trích dẫn của người dùng khác, toàn bộ dữ liệu đã không được nạp vào bộ nhớ. Hãy xem một số tham số mapred-site.xml từ liên kết tài liệu Apache.

mapreduce.reduce.merge.inmem.threshold 

Giá trị mặc định: 1000. Đây là ngưỡng, về số lượng tệp cho quá trình hợp nhất trong bộ nhớ.

mapreduce.reduce.shuffle.merge.percent 

Giá trị mặc định bằng 0,66. Ngưỡng sử dụng mà tại đó một hợp nhất trong bộ nhớ sẽ được bắt đầu, được biểu thị bằng phần trăm của tổng bộ nhớ được cấp phát để lưu trữ các kết quả đầu ra bản đồ trong bộ nhớ, như được xác định bởi mapreduce.reduce.shuffle.input.buffer.percent.

mapreduce.reduce.shuffle.input.buffer.percent 

Giá trị mặc định bằng 0,70. Phần trăm bộ nhớ được phân bổ từ kích thước heap tối đa để lưu trữ kết quả đầu ra bản đồ trong khi trộn.

mapreduce.reduce.input.buffer.percent 

Giá trị mặc định bằng 0. Phần trăm bộ nhớ- liên quan đến kích thước heap tối đa để giữ lại kết quả bản đồ trong khi giảm. Khi phát ngẫu nhiên kết thúc, mọi kết quả đầu ra bản đồ còn lại trong bộ nhớ phải tiêu thụ ít hơn ngưỡng này trước khi giảm có thể bắt đầu.

mapreduce.reduce.shuffle.memory.limit.percent 

Giá trị mặc định là: 0,25. Phần trăm giới hạn tối đa trong bộ nhớ mà một shuffle đơn lẻ có thể tiêu thụ

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