Количество редукторов в хаупе

Я изучал хауоп, я обнаружил, что количество редукторов очень запутанно:

1) Количество редукторов равно количеству разделов.

2) Количество редукторов равно 0,95 или 1,75, умноженное на (количество узлов) * (количество максимальных контейнеров на узел).

3) Количество редукторов задается mapred.reduce.tasks.

4) Количество редукторов ближе всего к: кратному размеру блока * время выполнения задачи от 5 до 15 минут * создает наименьшее возможное количество файлов.

Я очень запутался, мы явно задаем количество редукторов или это делается самой программой mapreduce?

Как рассчитывается количество редукторов? Подскажите, пожалуйста, как рассчитать количество редукторов.


person Mohit Jain    schedule 04.07.2016    source источник


Ответы (4)


1 - Количество редукторов равно количеству разделов - False. Один редьюсер может работать с одним или несколькими разделами. Но выбранный раздел будет полностью создан на редюсере, на котором он запущен.

2. Это всего лишь теоретическое максимальное количество редукторов, которые вы можете настроить для кластера Hadoop. Что очень сильно зависит от типа данных, которые вы обрабатываете (решает, насколько тяжелой работой обременены редукторы).

3 — Конфигурация mapred-site.xml — это всего лишь предложение для Yarn. Но внутри ResourceManager работает собственный алгоритм, оптимизирующий работу на ходу. Таким образом, это значение на самом деле не является количеством задач редуктора, выполняемых каждый раз.

4 - Это кажется немного нереальным. Размер моего блока может составлять 128 МБ, и каждый раз я не могу иметь минимальное количество редукторов 128 * 5. Это снова ложь, я считаю.

Не существует фиксированного количества задач редукторов, которые можно настроить или рассчитать. Это зависит от момента, сколько ресурсов действительно доступно для распределения.

person ViKiG    schedule 04.07.2016
comment
Спасибо за ответ, я получил ваши 1,2 и 3 балла. Но я думаю, если мы установим mapred.reduce.tasks, то это будет количество редукторов. Поправьте меня, если я ошибаюсь. Итак, я думаю, что это происходит так: количество редукторов, которые мы можем установить с помощью mapred.reduce.tasks метода setnumReducetasks() и количества разделов, делит данные между задачами редуктора. Просьба уточнить. - person Mohit Jain; 05.07.2016
comment
Да, в большинстве случаев вызов метода setNumReduceTasks() в классе драйвера работает. Иногда я видел, когда я устанавливал количество редукторов равным 6, когда требуется только 2, ApplicationManager просто запускает дополнительные 4 пустых редуктора, ничего не делая. И если вы установите количество редукторов меньше необходимого, это может соответствовать вашей настройке, но это не будет оптимизированной настройкой для запуска MapReduce. Обычно я вычисляю размер входной записи перед MapReduce и устанавливаю приблизительные редукторы, которые могут понадобиться. - person ViKiG; 05.07.2016
comment
@ViKiG Что касается пункта 3. Если hadoop использует свой собственный алгоритм для расчета оптимального количества редукторов, зачем мне указывать количество редукторов? - person Bemipefe; 01.01.2019
comment
@Bemipefe Если количество редукторов, указанных в mapred-site.xml, равно 6, а фактически возможных или необходимых редукторов равно 2, то будет создано только 2, но не 6. Если требуемых редукторов больше 6, вероятно, редукторов будет только 6, даже если иметь ›6 хорошо. Большую часть этого я понял путем экспериментов и сравнения с документацией. - person ViKiG; 02.01.2019

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

job.setNumReduceTasks(x)

По умолчанию на 1 ГБ данных будет использоваться один редуктор.

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

Точно так же, если ваши данные составляют 10 ГБ, будет использоваться редуктор 10.

Вы также можете изменить конфигурацию, чтобы вместо 1 ГБ вы могли указать больший или меньший размер.

свойство в улье для установки размера редуктора:

hive.exec.reducers.bytes.per.reducer

вы можете просмотреть это свойство, выполнив команду set в hive cli.

Partitioner только решает, какие данные пойдут к какому редюсеру.

person user3484461    schedule 05.07.2016

Ваша работа может нуждаться или не нуждаться в редукторах, это зависит от того, что вы пытаетесь сделать. При наличии нескольких редьюсеров задачи сопоставления разбивают свой вывод, создавая по одному разделу для каждой задачи редукции. В каждом разделе может быть много ключей (и связанных с ними значений), но все записи для любого заданного ключа находятся в одном разделе. Одно эмпирическое правило заключается в том, чтобы стремиться к редукторам, каждый из которых работает около пяти минут и которые производят как минимум один блок HDFS на выходе. Слишком много редьюсеров, и вы получите много маленьких файлов.

person red    schedule 26.09.2016

Partitioner гарантирует, что одни и те же ключи от нескольких мапперов попадут в один и тот же редуктор. Это не означает, что количество разделов равно количеству редукторов. Однако вы можете указать количество задач сокращения в программе драйвера, используя экземпляр задания, например job.setNumReduceTasks(2). Если вы не укажете количество задач сокращения в программе-драйвере, она выберет из mapred.reduce.tasks, значение по умолчанию которого равно 1 (https://hadoop.apache.org/docs/r1.0.4/mapred-default.html), то есть все выходные данные картографов будут тот самый редуктор.

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

person gunner87    schedule 04.07.2016
comment
Спасибо за комментарий. Если есть три раздела и мы установим количество задач сокращения равным 2, то как будут разделены данные, будут ли данные для 2 практиков попадать в один, а данные из одного раздела - в другой редуктор? Также мы можем установить размер разделения ввода, чтобы мы могли установить количество картографов. - person Mohit Jain; 05.07.2016
comment
Если есть 3 раздела, то данные уже разделены, и мастер назначит редукторы для 3 разделов. Мастер будет получать сообщения сердцебиения от узлов данных, которые содержат информацию о его доступности, ресурсах и т. д. Мастер использует эту информацию при планировании. Редуктор, который получает 2 раздела, будет обрабатывать один раздел за другим. Более подробную информацию о количестве редукторов и картографов можно найти по этой ссылке: stackoverflow.com/questions/6885441/ - person gunner87; 05.07.2016
comment
@gunner87 Gunner87 Я считаю, что если mapred.reduce.tasks не указан, по умолчанию используется значение 1, только если все разделы могут поместиться в одном узле. Что делать, если размер созданного раздела превышает свободное пространство HDFS на одном узле? - person Bemipefe; 01.01.2019