Пример пользовательского разделителя - PullRequest
5 голосов
/ 25 октября 2011

Я пытаюсь написать новое задание Hadoop для входных данных, которое несколько искажено.В качестве примера можно привести пример подсчета слов в руководстве по Hadoop, за исключением того, что одно конкретное слово присутствует много раз.

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

Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 25 октября 2011

Не думайте, что в Hadoop один и тот же ключ может быть сопоставлен с несколькими редукторами. Но ключи могут быть разделены так, чтобы редукторы были более или менее равномерно загружены. Для этого входные данные должны быть сэмплированы, а ключи должны быть соответствующим образом разделены. Проверьте Yahoo Paper для более подробной информации о пользовательском разделителе. Код сортировки Yahoo находится в пакете org.apache.hadoop.examples.terasort .

Допустим, клавиша A имеет 10 строк, B имеет 20 строк, C имеет 30 строк и D имеет 60 строк на входе. Затем ключи A, B, C могут быть отправлены в редуктор 1, а ключ D может быть отправлен в редуктор 2, чтобы равномерно распределить нагрузку на редукторы. Для разделения ключей необходимо выполнить выборку входных данных, чтобы узнать, как распределены ключи.

Вот еще несколько предложений по ускорению выполнения задания.

Укажите Combiner на JobConf , чтобы уменьшить количество ключей, отправляемых редуктору. Это также уменьшает сетевой трафик между задачами маппера и редуктора. Хотя нет никакой гарантии, что объединитель будет вызван средой Hadoop.

Кроме того, поскольку данные перекошены (некоторые ключи повторяются снова и снова, скажем, «инструменты»), вы можете увеличить # количество задач сокращения , чтобы завершить задание быстрее. Это гарантирует, что в то время как редуктор обрабатывает «инструменты», другие данные обрабатываются другими редукторами параллельно.

1 голос
/ 25 октября 2011

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

Hadoop имеет встроенную функцию, которая делает что-то подобное: объединитель.

Комбайнер - это функциональность типа «редуктор». Это гарантирует, что в рамках задачи карты может быть выполнено частичное сокращение данных и, следовательно, сокращено количество записей, которые необходимо обработать позже.

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

...