hadoop MapReduce: найти максимальную пару значений ключа из вывода картографа - PullRequest
3 голосов
/ 13 декабря 2011

Звучит как простая работа, но с MapReduce все не так просто.

У меня есть N файлов, в которых для каждого файла есть только одна строка текста. Мне бы хотелось, чтобы Mapper выводил пары ключ-значение, такие как <имя_файла, оценка>, в которых «оценка» - это целое число, вычисленное по строке текста. В качестве идентификатора я использую приведенный ниже фрагмент кода (надеюсь, это правильно).

 FileSplit fileSplit = (FileSplit)reporter.getInputSplit();
 String fileName = fileSplit.getPath().getName();

Если маппер выполняет свою работу правильно, он должен вывести N пары значений ключа. Теперь проблема в как мне запрограммировать редуктор для вывода пары «ключ-значение» с максимальным «счетом» ?

Из того, что я знаю, Reducer работает только с парами ключ-значение, которые имеют один и тот же ключ. Поскольку выходные данные в этом сценарии имеют разные ключи, я предполагаю, что что-то должно быть сделано до шага уменьшения. Или, может быть, следует полностью исключить шаг уменьшения?

Ответы [ 5 ]

3 голосов
/ 14 декабря 2011

Предположим, что

Файл1 имеет 10,123,23,233

Файл2 имеет 1,3,56,1234

Файл3 имеет 6,1,3435,678


Вот подход для поиска максимального числа из всех входных файлов.

  1. Давайте сначала сделаем некоторую случайную выборку (как, скажем, каждые N записей). Из файлов1 123 и 10, из файлов2 56 и 1, из файлов3 1 и 678.

  2. Выберите максимальное число из случайной выборки, которое составляет 678.

  3. Передайте максимальное число от случайной выборки до картографа и проигнорируйте входные числа за вычетом максимального числа, найденного в случайной выборке, и испустите остальные в картографических картах. Картографы будут игнорировать все, что меньше 678 и испускают 678, 1234 и 3435.

  4. Сконфигурируйте задание для использования 1 редуктора и найдите максимальное число всех чисел, отправленных в редуктор. В этом сценарии редуктор получит 678, 1234 и 3435. И рассчитает максимальное число, равное 3435.


Некоторые наблюдения вышеуказанного подхода

  1. Данные должны быть переданы дважды.

  2. Объем данных, передаваемых между картографами и редукторами, уменьшается.

  3. Данные, обрабатываемые редукторами, также уменьшаются.

  4. Чем лучше входная выборка, тем быстрее выполняется задание.

  5. Комбинатор с функциями, аналогичными редуктору, еще больше улучшит время работы.

2 голосов
/ 13 декабря 2011

Вы можете использовать методы setup () и cleanup () (методы configure () и close () в старом API).Объявите глобальную переменную в классе Reduce, которая определяет максимальный балл.Для каждого вызова, чтобы уменьшить, вы бы сравнили входное значение (оценка) с глобальной переменной.

Setup () вызывается один раз, прежде чем все вызовы сокращения в одной и той же задаче сокращения.Cleanup () вызывается после последнего вызова сокращения в той же самой задаче сокращения.Таким образом, если у вас несколько редукторов, методы Setup () и cleanup () будут вызываться отдельно для каждой задачи сокращения.

0 голосов
/ 21 марта 2015

пропустите редуктор !!Используйте конфигурацию, чтобы установить глобальную переменную в качестве показателя и ключа, а затем получить к ней доступ в маппере, чтобы сделать простой выбор максимального значения, используя глобальную переменную в качестве памяти для максимального значения и ключа. Это должно быть просто.Похоже.

0 голосов
/ 03 января 2014

См. Слайды 32 и 33 из http://www.slideshare.net/josem.alvarez/map-reduceintro

Я использовал тот же подход и получил результат. Беспокойство вызывает только то, что когда у вас есть несколько полей, вам нужно создавать fieldnamemin и fieldnamemax по отдельности.

0 голосов
/ 13 декабря 2011

Вы можете вернуть имя файла и счет в качестве значения и просто вернуть любую константу в качестве ключа от вашего картографа

...