2017-02-18 24 views
0

Я делаю подсчет слов с сортировкой (по значению) в одной задаче MapReduce. Два пути для достижения этой цели:один редуктор против нескольких редукторов с последующей обработкой для подсчета слов и сортировки. Какой из них более эффективен и масштабируемо?

  1. Используя один редуктор и сохранение все в HashMap в функции уменьшения и сортировки все по значению функции Cleanup, а затем писать все в файл.

  2. Использование нескольких редукторов и сохранение количества слов в HDFS после задания MapReduce. После того, как MR будет сортировать все, используя Java.

Какое решение лучше в смысле эффективности и масштабируемости.

ответ

0

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

part-r-00000 
word1 1 
word2 3 

part-r-00001 
word3 2 
word4 5 

Даже если сортировать каждый файл по значениям, будет трудно перебирать слова в порядке убывания word4-word2-word3-word1. Тем не менее, вы можете сделать некоторые трюки.

С другой стороны, один редуктор будет работать медленнее, потому что ему придется обрабатывать все данные. Также возможно, что у вас недостаточно памяти для хранения всех данных в куче JVM редуктора.

Я бы выбрал один редуктор, если это возможно.

+0

Во втором варианте сортировка может выполняться через Java Collection.sort() путем доступа к каждому файлу (part-r-00000, part-r-00001, ...) и получения значений и их хранения в HashMap. Каждая запись hashmap может быть добавлена ​​в список и может быть отсортирована с помощью Collection.sort(). Считаете ли вы, что это возможно, если мы имеем дело с большими файлами? –

+0

@HamzaMalik Какой смысл читать все файлы с помощью java-программы после MR-работы, если вы можете сделать то же самое в редукторе? – AdamSkywalker

+0

Потому что в одной задаче MR я могу найти частоту слов (мой редуктор суммирует все конечные частоты) и записывается обратно в HDFS. Я также хочу сортировать значение ключа, выводимое по значению, но с помощью ключа (слов). –

0

Для обобщенной рабочей нагрузки (включая число слов), имеющей один редуктор, не является хорошей идеей, так как это является очевидным узким местом (т. Е. К нему идут все множественные выходы отображения). Поэтому предпочтительнее вариант .

Также обратите внимание, что выход редуктора сортируется так, что «HashMap», «cleanUp» являются избыточными в опции .

+0

По своему усмотрению я имею в виду сортировку по значению, обновленную в вопросе. –