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.
Nguồn
2012-06-13 23:28:01
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
Đã 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? –
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