Могу ли я получить индивидуально отсортированные выходы Mapper из Hadoop при использовании нулевых редукторов? - PullRequest
5 голосов
/ 25 июня 2010

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

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

  • Если я запускаю с numReducers = 0, он выполняется быстро, и каждый Mapper записывает свой собственный выходной файл, что нормально -но файлы не сортируются.
  • Если я добавлю один редуктор (обычный Reducer.class), это добавит ненужный глобальный шаг сортировки к одному файлу, который занимает много часов (намного дольше, чем задачи карты).
  • Если я добавлю несколько редукторов, результаты отдельных заданий карты будут сведены воедино, поэтому выходные данные одной карты окажутся в нескольких файлах.

Есть ли способ убедить Hadoop выполнитьсортировка на стороне карты на выходе каждого задания, без использования редукторов, или любой другой способ пропустить медленное глобальное слияние?

Ответы [ 4 ]

2 голосов
/ 25 июня 2010

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

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

Мне интересно, почему вы все равно хотите отдельно сортировать вывод mapper?

Еще одна мысль: Hadoop на самом деле собирается выполнить сортировку на стороне отображения («перемешивание»), если вы сортируете свои выходные данные, так что вы, вероятно, могли бы не удалять эти временные файлы, если вы работали со многими редукторами.

2 голосов
/ 26 апреля 2011

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

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

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

Надеюсь, это поможет.

1 голос
/ 16 августа 2013

Если данные, используемые вашими мапперами, невелики, вы можете избежать их сбора и отслеживать данные в локальной, отсортированной структуре данных. Затем вы можете выполнить запись / сбор отсортированных данных на этапе очистки / завершения.

0 голосов
/ 25 июня 2010

См. Комментарий Бена ниже - это не работает. Я оставлю здесь неправильный ответ, чтобы мы хотя бы знали, что не работает.

Я верю, что Combiner сделает для вас. Я никогда не использовал их сам, но http://hadoop.apache.org/common/docs/r0.20.1/mapred_tutorial.html утверждает (раздел Payload / Mapper):

Пользователи могут по желанию указать объединитель, через JobConf.setCombinerClass (Class), чтобы выполнить локальную агрегацию промежуточные выходы, которые помогают сократить количество данных переведен из картографа в Reducer.

Мое прочтение таково, что если вы указали редуктор идентификации в качестве объединителя, то вывод каждого преобразователя должен быть отсортирован.

...