Когда в Hadoop запускаются задачи сокращения? Начинаются ли они после завершения определенного процента (порога) картографов? Если да, установлен ли этот порог? Какой порог обычно используется?
Ответы:
Фаза сокращения состоит из 3 шагов: перемешивание, сортировка, уменьшение. В случайном порядке данные собираются редуктором от каждого сопоставителя. Это может произойти, пока картографы генерируют данные, поскольку это всего лишь передача данных. С другой стороны, сортировка и сокращение могут начаться только после того, как все сопоставления будут выполнены. Вы можете определить, что делает MapReduce, посмотрев на процент завершения редуктора: 0-33% означает, что он выполняет перемешивание, 34-66% - сортировка, 67% -100% - сокращение. Вот почему ваши редюсеры иногда кажутся "застрявшими" на 33% - они ждут завершения работы мапперов.
Редукторы начинают перемешивание в зависимости от порогового значения процента завершивших работу преобразователей. Вы можете изменить параметр, чтобы редукторы запускались рано или поздно.
Почему ранний запуск редукторов - это хорошо? Потому что он распределяет передачу данных от картографов к редукторам с течением времени, что хорошо, если ваша сеть является узким местом.
Почему ранний запуск редукторов - это плохо? Потому что они сокращают количество слотов, копируя только данные и ожидая завершения работы мапперов. Другая работа, которая начинается позже и фактически использует слоты уменьшения, теперь не может их использовать.
Вы можете настроить запуск редукторов, изменив значение по умолчанию mapred.reduce.slowstart.completed.maps
in mapred-site.xml
. Значение 1.00
будет ждать завершения всех преобразователей перед запуском редукторов. Значение сразу 0.0
запустит редукторы. Значение 0.5
запустит редукторы, когда половина картографов будет завершена. Вы также можете вносить изменения mapred.reduce.slowstart.completed.maps
для каждой работы. В новых версиях Hadoop (не ниже 2.4.1) параметр называется ismapreduce.job.reduce.slowstart.completedmaps
(спасибо пользователю yegor256).
Как правило, я предпочитаю оставить mapred.reduce.slowstart.completed.maps
выше, 0.9
если в системе одновременно выполняется несколько заданий. Таким образом, работа не загружает редукторы, когда они ничего не делают, кроме копирования данных. Если вы выполняете только одно задание за раз, 0.1
то, вероятно, будет уместно.
Фаза сокращения может начаться задолго до вызова редуктора. Как только преобразователь завершает задание, сгенерированные данные подвергаются некоторой сортировке и перемешиванию (что включает вызов объединителя и разделителя). «Фаза» редуктора запускается в момент начала обработки данных пост-картографа. По завершении этой обработки вы увидите прогресс в процентах редукторов. Однако ни один из редукторов пока не вызван. В зависимости от количества доступных / используемых процессоров, характера данных и количества ожидаемых редукторов вы можете изменить параметр, как описано выше @ Donald-miner.
Насколько я понимаю, фаза сокращения начинается с фазы карты и продолжает потреблять записи с карт. Однако, поскольку после фазы отображения есть фаза сортировки и перемешивания, все выходные данные должны быть отсортированы и отправлены редуктору. Итак, логически вы можете представить, что этап сокращения начинается только после этапа сопоставления, но на самом деле редукторы по соображениям производительности также инициализируются с помощью сопоставителей.
Процент, показанный для фазы сокращения, фактически соответствует количеству данных, скопированных из выходных данных карт во входные каталоги редукторов. Чтобы узнать, когда начинается это копирование? Это конфигурация, которую вы можете установить, как показал Дональд выше. После того, как все данные скопированы в редукторы (т.е. 100% -ное сокращение), редукторы начинают работать и, следовательно, могут зависнуть в «100% -ном сокращении», если ваш код редукторов требует большого количества операций ввода-вывода или ЦП.
Рассмотрим пример WordCount, чтобы лучше понять, как работает задача уменьшения карты. Предположим, у нас есть большой файл, скажем, роман, и наша задача - найти, сколько раз каждое слово встречается в файле. Поскольку файл большой, он может быть разделен на разные блоки и реплицирован на разных рабочих узлах. Задание подсчета слов состоит из задач сопоставления и сокращения. Задача карты принимает в качестве входных данных каждый блок и создает промежуточную пару "ключ-значение". В этом примере, поскольку мы подсчитываем количество появлений слов, преобразователь при обработке блока приведет к промежуточным результатам формы (word1, count1), (word2, count2) и т. Д. Промежуточные результаты всех преобразователей прошел через фазу перемешивания, которая изменит порядок промежуточного результата.
Предположим, что выходные данные нашей карты от разных картографов имеют следующую форму:
Карта 1: - (is, 24) (was, 32) (and, 12)
Карта 2: - (my, 12) (is, 23) (was, 30)
Выходные данные карты сортируются таким образом, что одни и те же ключевые значения передаются одному и тому же редуктору. Здесь это будет означать, что ключи, соответствующие is, was и т. Д., Относятся к одному и тому же редуктору. Это редуктор, который производит окончательный результат, который в этом случае будет: - (и, 12) (is, 47) (my, 12 ) (было, 62)
Редукторные задачи запускаются только после завершения completion
работы всех картографов.
Но передача данных происходит после each
Map. На самом деле это операция вытягивания.
Это означает, что каждый раз reducer будет запрашивать каждую задачу map, есть ли у них какие-то данные для извлечения из Map. Если они обнаруживают, что какой-либо mapper выполнил свою задачу, Reducer извлекает промежуточные данные.
Промежуточные данные из Mapper хранятся в disk
. А передача данных из Mapper в Reduce происходит через сеть ( Data Locality
не сохраняется на этапе Reduce).