2012-02-27 2 views
0

У меня есть 2 файлы, хранящиеся на HDFS файловой системы:Ваши советы по работе Hadoop MapReduce

  • tbl_userlog: <website url (non canonical)> <tab> <username> <tab> <timestamp>

    • пример: www.website.com, foobar87, 201101251456
  • tbl_websites: <website url (canonical)> <tab> <total hits>

    • пример: website.com, 25889

Я написал последовательность Hadoop рабочих мест, которая соединяет 2 файла на веб-сайте, выполняет фильтр на сумму общих хитов> п на сайте и затем подсчитывает для каждого пользователя количество веб-сайтов, которые он посетил, которые имеют> n общих хитов. Подробная информация о последовательности являются следующей:

  1. карты только для работы, которая canonicizes URL-адреса в tbl_userlog (т.е. удаляет WWW, HTTP: // и https: // из поля URL)
  2. карты -только работа, которая сортирует tbl_websites на URL
  3. идентичность Map-Reduce работу, которая принимает выходной 2 предыдущих рабочих мест как KeyValueTextInput и подает их на CompositeInput для того, чтобы использовать Hadoop нативного соединения функции, определенный с jobConf.set("mapred.join.expr", CompositeInputFormat.compose("inner" (...))
  4. A Map and Reduce job, которая фильтрует результат предыдущей работы по общим хитам> n на своей фазе карты, группирует результаты o n в фазе перетасовки и выполняет подсчет количества веб-сайтов для каждого пользователя на этапе «Уменьшение».

Чтобы связать эти шаги, я просто вызываю задания последовательно в описанном порядке. Каждое отдельное задание выводит результаты в HDFS, после чего последующее задание в цепочке затем извлекает и обрабатывает по очереди.

Как я новичок в Hadoop, я хотел бы попросить вашего консультирования:

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

Я использую Apache Hadoop 0.20.2, и использование рамок более высокого уровня, таких как Pig или Hive, невозможно в рамках проекта.

Заранее благодарим за ваши ответы!

+0

Какова цель алгоритма? Нужно ли находить количество веб-сайтов, которые посетили каждый пользователь, учитывая, что на веб-сайте есть число пользователей, количество которых составляет n? Кроме того, можете ли вы уточнить, какой должен быть этот вопрос? Вы ищете инструмент управления рабочими процессами (например, oozie, предложенный другим плакатом) или вы ищете подтверждение своего конкретного рабочего процесса? –

+0

@Pradeep Gollakota: Да, цель задания - найти для каждого пользователя количество веб-сайтов, которые он посетил, которые имеют общие хиты> n. Я не ищу какой-либо инструмент управления (хотя я посмотрю на Oozie, что кажется многообещающим), я ищу только проверку моего конкретного рабочего процесса и дизайна. Мой вопрос, в частности, заключается в следующем: как бы вы разработали этот рабочий поток, используя только простой Hadoop_? – Namux

ответ

0

Я думаю, что у вас есть работа с несколькими предостережениями. Прежде чем я начну перечислять их, я хочу сделать два определения понятными. Задача только для карты - это задание, которое имеет определенный Mapper и run с 0 редукторами. Если задание выполняется с помощью> 0 IdentityReducers, то задание не является заданием только для отображения.Задача, предназначенная только для сокращения, - это задание, которое имеет определение Reducer и run's с IdentityMapper.

  1. Ваша первая работа, может быть заданием только для карт, поскольку все, что вы делаете, это канонизировать URL-адреса. Но если вы хотите использовать CompositeInputFormat, вам следует запустить с IdentityReducer с более чем 0 редуктором.
  2. Для вашей второй работы я не знаю, что вы подразумеваете под заданием только для карты. Сортировка по самой своей природе - это задача уменьшения стороны. Вероятно, вы имеете в виду, что он имеет определение Mapper, но не имеет редуктора. Но для того, чтобы URL-адреса были отсортированы, вы должны запустить с IdentityReducer с более чем 0 редуктором.
  3. Ваша третья работа - интересная идея, но вы должны быть осторожны с CompositeInputFormat. Для того, чтобы вы могли использовать этот формат ввода, вам необходимо выполнить два условия. Во-первых, должно быть одинаковое количество файлов в обоих входных каталогах. Этого можно достичь, установив одинаковое количество редукторов для Job1 и Job2. Второе условие заключается в том, что входные файлы НЕ МОГУТ быть разделяемыми. Этого можно добиться с помощью нерасщепляемого сжатия, такого как bzip.
  4. Эта работа звучит хорошо. Хотя вы можете отфильтровать веб-сайт с < n хитами в редукторе предыдущей работы и сэкономить несколько операций ввода-вывода.

Очевидно, что существует несколько проблем с решением проблемы в программном обеспечении, поэтому, хотя решение будет работать, я бы не рекомендовал его. Имея 4 задания MapReduce для этой задачи, немного дороже ИМХО. Реализация, которую я имею в виду, - это рабочий процесс M-R-R, который использует Secondary Sort.

+0

Здравствуйте, @Pradeep и благодарим вас за подробное объяснение. Я потратил некоторое время на размышления о работе и придумал решение с двумя заданиями Map + _r_ IdentityReducers (один для URL-адреса пользователя и сортировки пользователей, а также для фильтрации веб-сайтов по общим хитам и сортировке) и 1 Map + Уменьшить работу с CompositeInputFormat , Меня интересует ваша реализация M-R-R + Secondary Sort, не могли бы вы подробнее ее детализировать? – Namux

0

Что касается цепочки заданий, вы должны взглянуть на Oozie, который является менеджером рабочего процесса. Мне еще нужно его использовать, но я начинаю.

+0

Спасибо за ваш ответ, я посмотрю на Оози. Но мое требование - реализовать этот рабочий процесс, используя простой Hadoop. Вы видите оптимизацию, которая может быть сделана? – Namux

Смежные вопросы