Верхние значения N по Hadoop Map Уменьшить код

Я очень новичок в мире hadoop и изо всех сил стараюсь достичь одной простой задачи. Кто-нибудь, пожалуйста, скажите мне, как получить верхние n значений для примера подсчета слов, используя только метод снижения кода в Map? Я не хочу использовать любую команду hadoop для эта простая задача. Любая идея или предложение действительно помогут. Спасибо.

Ответ 1

У вас есть два очевидных варианта:


У вас есть два задания MapReduce:

  • WordCount: подсчитывает все слова (в точности, пример)
  • TopN: задание MapReduce, которое находит верхний N чего-то (вот несколько примеров: исходный код, сообщение в блоге)

Сделайте вывод WordCount для записи в HDFS. Затем, чтобы TopN прочитал этот вывод. Это называется цепочкой заданий, и есть несколько способов решить эту проблему: oozie, bash scripts, запуск двух заданий из вашего драйвера и т.д.

Причина, по которой вам нужны два задания, заключается в том, что вы выполняете две совокупности: один - это количество слов, а второе - topN. Обычно в MapReduce для каждой агрегации требуется собственное задание MapReduce.


Сначала запустите задание WordCount на данные. Затем используйте несколько bash, чтобы вытащить верхнюю часть N.

hadoop fs -cat /output/of/wordcount/part* | sort -n -k2 -r | head -n20

sort -n -k2 -r говорит "сортировать численно по столбцу №2 в порядке убывания". head -n20 тянет верхнюю двадцать.

Это лучший вариант для WordCount, просто потому, что WordCount, вероятно, будет выводиться только на тысячу или десятки тысяч строк, и для этого вам не потребуется задание MapReduce. Помните, что только потому, что у вас есть хаос вокруг, это не значит, что вы должны решить все свои проблемы с помощью Hadoop.


Одна неочевидная версия, которая сложна, но представляет собой сочетание обоих вышеперечисленных...

Напишите задание WordCount MapReduce, но в Reducer выполните что-то вроде заданий TopN MapReduce, которые я показал вам раньше. Затем, каждый редуктор выводит из этого редуктора только TopN.

Итак, если вы делаете Top 10, каждый редуктор выдает 10 результатов. Скажем, у вас 30 редукторов, вы получите 300 результатов.

Затем выполните то же самое, что и в опции №2 с bash:

hadoop fs -cat /output/of/wordcount/part* | sort -n -k2 -r | head -n10

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

Это самый быстрый способ сделать это, но это, вероятно, не стоит усилий.