Объединение двух наборов ввода в hadoop - PullRequest
2 голосов
/ 28 апреля 2010

У меня довольно простой вопрос о hadoop, который я постараюсь представить на примере

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

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

edit: На самом деле я не пытаюсь создать уменьшенную версию карты grep. Я использовал это как пример наличия 2 разных входов для картографа. Давайте просто скажем, что я перечислил A и B и хотел бы, чтобы маппер работал с 1 элементом из списка A и 1 элементом из списка B

Итак, учитывая, что проблема не связана с данными, что привело бы к необходимости создания цепочек заданий, мой единственный вариант - как-то разделить весь список A на всех сопоставителях, а затем ввести 1 элемент списка B каждому сопоставителю?

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

Ответы [ 3 ]

1 голос
/ 29 апреля 2010

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

В противном случае вы можете умножить каждую строку ввода на количество шаблонов. Обработайте каждую строку одним шаблоном. И запустите редуктор потом. A ChainMapper является решением выбора здесь. Но помните: линия появится дважды, если она соответствует двум шаблонам. Это то, что вы хотите?

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

Подсказка: Вы можете распространять шаблоны с помощью функции DistributedCache среди всех картографов! ;-) Ввод должен быть разделен с помощью InputLineFormat

0 голосов
/ 03 мая 2010

у хорошего друга было великое прозрение: как насчет цепочки 2 картографов?

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

в свою очередь, первый маппер начинает новое задание, где вводится текст. Он может передать строку, установив переменную в контексте.

0 голосов
/ 03 мая 2010

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

Конечно, целесообразно, чтобы маппер нуждался в некоторой поддержкеинформация для обработки ввода.Эта информация может быть пропущена с помощью Конфигурации задания (например, Configuration.setString ()).Большой набор данных должен быть передан через распределенный кеш.

Вы рассматривали один из этих вариантов?Я не уверен, полностью ли я понял вашу проблему, поэтому, пожалуйста, проверьте сами, сработает ли это; -)

Кстати: благодарное голосование за мой хорошо изученный предыдущий ответ было бы неплохо; -)

...