2015-05-05 2 views
0

Я прочитал о вторичной сортировке, где необходимо сортировать не только ключ, но и часть значения для каждого из ключей.Вторичная сортировка - оставьте это в каркасе Hadoop или сделайте это самостоятельно в редукторе

Есть два способа сделать это:

  • значения кэша в редукторе для каждого ключа и сортировки значений себя
  • Оставить работу в рамках Hadoop, указав пользовательский компаратор, Разметка ... все что вам нужно включить не только сортировку по ключу, но и по значению

Мой вопрос в том, когда вы порекомендуете сначала и когда второй подход?

Как я сейчас вижу - если фреймворк уже выполняет сортировку, почему бы не отсортировать его по ключу и значению в одно и то же время ... пожалуйста, исправьте меня, если есть какой-то побочный эффект. Например, что должно быть быстрее?

Я понимаю, что самая большая проблема «сортировки по-редуктору» - это количество записей, но я хотел бы получить всю картину.

ответ

0

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

Каждый редуктор копирует соответствующие релевантные результаты из всех картографов и магазинов на диске редуктора в виде нескольких файлов разлива. Фоновый поток объединяет все эти файлы разливов и создает один отсортированный файл.

Записи в последнем отсортированном файле sinlge сначала сортируются по естественному ключу. Затем записи каждого ключа внутренне сортируются с помощью ключа группировки (сортировка второго сегмента), если он настроен.

Таким образом, решение решить, когда использовать данные 2 сценария, зависит от количества копий в одном отсортированном файле для заданного ключа. Метод reduce считывает все значения ключа один за другим из одного отсортированного файла через итеративную ссылку, указанную в методе reduce().

Если какая-либо коллекция сортировки java, такая как TreeSet/TreeMap, способна хранить все значения ключа, при условии, что размер коллекции java не взорвет кучу памяти JVM редуктора, тогда вы можете пропустить вторичную сортировку и вы можете использовать саму сортировку Java для достижения порядка сортировки, который вы предпочитаете.

Если вы хотите, чтобы память кучи JVM для сортировки java-сортировки была недостаточной для хранения всех значений ключа, тогда вы должны предпочесть специальную вторичную сортировку Mapreduce, которая сортирует ключи (естественный сорт) и сортирует все значения ключевой внутренний (вторичный сорт) в фазе слияния/сортировки диска на отдельной фазе создания отсортированного файла и передаст значения в подготовленном отсортированном порядке методу сокращения для каждого ключа.

+0

Но есть ли разница в производительности? Кажется также более эффективным (быстрее) использовать Hadoop framework, поскольку он уже выполняет сортировку ... это действительно так? Или есть какая-то причина, по которой сортировка сокращений может быть быстрее? Я понимаю, что есть накладные расходы при написании дополнительного кода, но я готов это сделать, если он окупится. – Marko

+0

Вторичная сортировка эффективна, надежна и проста, насколько я заметил.Производительность хороша с секретной сортировкой, поскольку большая часть сортировки выполняется фоновым потоком в редукторе во время фазы перетасовки/сортировки, а методу reduce() не требуется тратить память и загрузку выполнения для сортировки значений для каждого ключ, используя коллекции, где он мог бы просто обрабатывать записи по мере их сортировки. – sureshsiva

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