Вопрос по mapreduce, hadoop – Значения Hadoop Reducer в памяти?

7

Я пишу задание MapReduce, которое может привести к огромному количеству значений в редукторе. Я обеспокоен тем, что все эти значения загружаются в память одновременно.

Соответствует ли базовая реализацияIterable<VALUEIN> values загружать значения в память как они нужны? Hadoop: Полное руководство, кажется, предполагает, что это так, но не дает "окончательного" ответ.

Вывод редуктора будет намного массивнее ввода значений, но я считаю, что вывод записывается на диск по мере необходимости.

Ваш Ответ

3   ответа
0

все данные не были загружены в память. Посмотрите на некоторые параметры mapred-site.xml изапаш ссылка на документацию.

mapreduce.reduce.merge.inmem.threshold

Значение по умолчанию: 1000. Это пороговое значение с точки зрения количества файлов для процесса слияния в памяти.

mapreduce.reduce.shuffle.merge.percent

Значение по умолчанию составляет 0,66. Порог использования, при котором будет инициировано слияние в памяти, выраженное в процентах от общей памяти, выделенной для хранения выходных данных карты в памяти, как определеноmapreduce.reduce.shuffle.input.buffer.percent.

mapreduce.reduce.shuffle.input.buffer.percent

Значение по умолчанию 0,70. Процент памяти, выделяемый из максимального размера кучи для хранения выходных данных карты во время перемешивания.

mapreduce.reduce.input.buffer.percent

Значение по умолчанию - 0. Процент памяти - относительно максимального размера кучи - для сохранения выходных данных карты во время уменьшения. Когда перемешивание завершено, любые оставшиеся выходные данные карты в памяти должны потреблять меньше этого порога, прежде чем может начаться уменьшение.

mapreduce.reduce.shuffle.memory.limit.percent

Значение по умолчанию: 0,25. Максимальный процент лимита в памяти, который может использовать один случайный случай

13

Вместо этого при циклическом просмотре списка значений Iterable каждый экземпляр объекта используется повторно, поэтому он сохраняет только один экземпляр в данный момент времени.

Например, в следующем коде объектный массив ArrayList будет иметь ожидаемый размер после цикла, но каждый элемент будет одинаковым, так как экземпляр Text val используется повторно при каждой итерации.

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);
            }
    }
}

(Если по какой-то причине вы хотели предпринять дальнейшие действия с каждым val, вам следует сделать глубокую копию и затем сохранить ее.)

Конечно, даже одно значение может быть больше, чем память. В этом случае разработчику рекомендуется предпринять шаги, чтобы сократить данные в предыдущем Mapper, чтобы значение не было таким большим.

UPDATE: См. Стр. 199-200 Hadoop The Definition Guide, 2-е издание.

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.
Отредактировано для уточнения. Я просто имел в виду, что даже одно значение может быть большим. Это маловероятно. & quot; Редуктор не сохраняет все значения в памяти & quot; это верное утверждение. Имеет ли это смысл?
Да. Спасибо тебе за пояснение. У вас есть ссылка на это, случайно? Zach
Высоко ценится. Спасибо. Zach
Я смущен вашим ответом. Сначала вы говорите: «Редуктор не сохраняет все значения в памяти». что подразумевает, что Iterable загружает значения по мере необходимости. Позже вы скажете: «Даже один экземпляр списка значений может быть больше, чем память». подразумевая, что список значений сначала загружается в память. Можете ли вы уточнить? Zach
Просто обновил мой ответ, чтобы включить ссылку.
2

часть его поступает с диска, при взгляде на код кажется, что среда разбивает Iterable на сегменты и загружает их с диска в память 1 по одному.

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

Не могли бы вы объяснить, как это решит проблему?

Похожие вопросы