В файловой системе HDFS хранятся 2 файла:
Я написал последовательность заданий Hadoop, которая объединяет 2 файла на веб-сайте, выполняет фильтрацию общего количества посещений> n для каждого веб-сайта, а затем подсчитывает для каждого пользователя количество посещенных веб-сайтов, на которых> n Всего хитов. Детали последовательности следующие:
- Задание только для карты, которое канонизирует URL в tbl_userlog (т.е. удаляет www, http: // и https: // из поля url)
- Работа только для карты, которая сортирует tbl_websites по URL
- Идентификационное задание Map-Reduce, которое принимает выходные данные двух предыдущих заданий как KeyValueTextInput и передает их в CompositeInput для использования собственной функции соединения Hadoop, определенной с
jobConf.set("mapred.join.expr", CompositeInputFormat.compose("inner" (...))
- Задание Map and Reduce, которое фильтрует результат предыдущего задания по общему количеству обращений> n на этапе Map, группирует результаты на этапе перетасовки и выполняет подсчет количества веб-сайтов для каждого пользователя в Уменьшить фазу.
Чтобы связать эти шаги, я просто вызываю задания последовательно в описанном порядке. Каждое отдельное задание выводит свои результаты в HDFS, которую затем извлекает и обрабатывает следующее задание в цепочке.
Поскольку я новичок в Hadoop, я хотел бы попросить вас проконсультироваться:
- Есть ли лучший способ связать эти задания? В этой конфигурации все промежуточные результаты записываются в HDFS и затем читаются обратно.
- Видите ли вы какой-либо недостаток дизайна в этой работе, или его можно было бы написать более элегантно, используя некоторые функции Hadoop, которые я пропустил?
Я использую Apache Hadoop 0.20.2, и использование высокоуровневых фреймворков, таких как Pig или Hive, невозможно в рамках проекта.
Заранее спасибо за ваши ответы!