2015-08-16 2 views
0

Моей карты уменьшить работу выглядит как следующее:Как пронумеровать мой шпагат и выбор нужного количества картографов/редукторы

I карта первого 2 квартала до ключа 1, следующие два будет отображены на клавишу 2 и так далее, вы можете обратиться с картинки:

enter image description here

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

Но мой вопрос:
Как правильно выбрать количество карт/редукторов в реальности?

Похоже, мне нужно, чтобы #mappers = #num hdfs блоков, , а число # редукторов будет равно половине #mappers. Это хороший подход? Каков правильный выбор для этого случая?

ответ

2
Partitioning your job into maps and reduces 

Выбор подходящего размера для задач для вашей работы может радикально изменить производительность Hadoop. Увеличение количества задач увеличивает издержки на основе структуры, но увеличивает балансировку нагрузки и снижает стоимость сбоев. В одном крайнем случае 1 карта/1 уменьшает случай, когда ничего не распределено. Другая крайность состоит в том, чтобы иметь 1 000 000 карт/1 000 000 сокращений, где у ресурса заканчиваются ресурсы для накладных расходов.

Number of Maps 

Число карт обычно определяется количеством блоков DFS во входных файлах. Хотя это заставляет людей корректировать размер блока DFS для настройки количества карт. Правильный уровень параллелизма для карт, по-видимому, составляет около 10-100 карт/узлов, хотя мы взяли его до 300 или около того для очень сложных задач карты. Настройка задачи занимает некоторое время, поэтому лучше всего, чтобы карты выполнялись как минимум на минуту.

Фактически контроль количества карт является тонким. Параметр mapred.map.tasks - это всего лишь подсказка к InputFormat для количества карт. Поведение InputFormat по умолчанию состоит в том, чтобы разделить общее количество байтов на нужное количество фрагментов. Однако в случае по умолчанию размер блока DFS входных файлов рассматривается как верхняя граница для входных разделов. Нижняя граница размера разделения может быть задана с помощью mapred.min.split.size. Таким образом, если вы ожидаете 10TB входных данных и имеете 128MB блоков DFS, вы получите 82k-карты, если ваши mapred.map.tasks еще больше. В конечном итоге InputFormat определяет количество карт.

Количество задач карты также можно увеличить вручную с помощью conf.setNumMapTasks JobConf (int num). Это можно использовать для увеличения количества задач карты, но не будет устанавливать число ниже, которое определяет Hadoop путем разделения входных данных.

Number of Reduces 

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

  • кратен размеру блока * Время задача от 5 до 15 минут * Создает наименьшее количество файлов возможно

Ничего кроме этого означает, что есть хорошие шансы на то, что ваши редукторы менее велики. Существует огромная тенденция для пользователей использовать ДЕЙСТВИТЕЛЬНО большое значение («Больше параллелизма означает быстрее!») Или ДЕЙСТВИТЕЛЬНО низкое значение («Я не хочу удалять свою квоту пространства имен!»).Оба одинаково опасны, в результате чего один или более из:

  • Грозной производительности на следующем этапе процесса * Ужасная производительность за счетом перетасовки * Ужасная общая производительность, потому что вы перегрузили NameNode с объектами, которые в конечном счете, бесполезный * Уничтожение дискового ввода-вывода для не очень разумной причины * Множество сетевых передач из-за работы с сумасшедшими объемами работы CFIF/MFIF

Теперь всегда есть исключения и особые случаи. Один особый случай состоит в том, что если после этого совета следующий шаг в рабочем процессе делает смешные вещи, тогда нам нужно скорее «быть исключением» в вышеупомянутых общих правилах.

В настоящее время количество сокращений ограничено примерно 1000 размером буфера для выходных файлов (io.buffer.size * 2 * numReduces < < heapSize). Это будет исправлено в какой-то момент, но пока оно не станет довольно твердой верхней границей.

Количество задач сокращения также может быть увеличено так же, как и задачи карты, через conf.setNumReduceTasks JobConf (int num).

У меня есть это, я думаю, что это решит ваше замешательство относительно количества редуктора. Предположим, что у вас есть 100 слотов для уменьшения, доступных в вашем кластере.

При коэффициенте нагрузки 0,95 все задачи сокращения 95 будут запускаться одновременно, так как для всех задач доступно достаточно слотов для снижения. Это означает, что никакие задачи не будут ожидаться в очереди, пока не закончится одно из остальных. Я бы рекомендовал этот вариант, когда задачи уменьшения «маленькие», т. Е. Заканчиваются относительно быстро, или все они требуют того же времени, более или менее.

С другой стороны, с коэффициентом нагрузки 1,75, 100 задач уменьшения будут запускаться в одно и то же время, так же как и доступные слоты уменьшения, а 75 остатков будут ждать в очереди, пока не будет уменьшен слот доступный. Это обеспечивает лучшую балансировку нагрузки, поскольку, если некоторые задачи «тяжелее», чем другие, т. Е. Требуют больше времени, то они не будут узким местом работы, поскольку другие сокращают интервалы, вместо того, чтобы заканчивать свои задачи и ждать, теперь выполнять задачи в очереди. Это также облегчает загрузку каждой задачи сокращения, так как данные выхода карты распространяются на большее количество задач.

https://github.com/paulhoule/infovore/wiki/Choosing-the-number-of-reducers

+0

Я видел это в документации Hadoop, я хотел бы знать, как уместить это в точности моей модели здесь .. – member555

+0

проверить обновление анс. –

+0

Сколько у вас узлов? –