2015-12-07 3 views
0

Когда я пользуюсь функцией job.setNumReduceTasks(1);, я получаю вывод, отсортированный по ключу. Однако при удалении этой функции вывод не сортируется по ключу.Количество редукторов и порядок вывода

Итак, следует ли ожидать получения отсортированного выхода от редуктора, когда у нас есть более чем одна задача редуктора?

Спасибо.

+0

Можете ли вы подробнее рассказать? Можете ли вы дать некоторые данные, чтобы показать, что выход редуктора не отсортирован? –

+0

Взгляните на http://stackoverflow.com/questions/33298159/difference-between-partial-sort-total-sort-and-secondary-sort-in-hadoop/33301253#33301253 и http: //blog.zaloni .com/вторичная сортировка в-Hadoop –

ответ

1

Выход сортируется по ключу в пределах одного редуктора. Однако Partitioner по умолчанию является результатом хеш-функции, поэтому, пока каждый файл будет отсортирован, если используется несколько редукторов, один файл не будет сортированным продолжением последнего. Например:

У нас есть счетчик слов с тремя редукторами. Картограф выходы:

(A,1) 
(zebra,1) 
(bat,1) 
(zebra,1) 
(frog,1) 
(A,1) 

Разметка выглядит следующим образом

public int getPartition(K key, V value, int numReduceTasks) { 
    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; 
} 

и поэтому он может выделить ключи следующим образом:

REDUCER 1 REDUCER 2 REDUCER 3 
(A,1)  (frog,1)  (bat,1) 
(A,1)  
(zebra,1) 

Обратите внимание, что Reducer 1 не содержит AF, Reducer 2 не содержит GM, а Reducer 3 не содержит NZ, то есть не разбивается по алфавиту. И поэтому общий вывод не будет сортироваться, но данные будут отсортированы в каждом выходе редуктора.

Это имеет смысл, поскольку в противном случае мы могли бы получить большой перекос. Скажем, например, вы используете задание MapReduce по некоторым данным о службах клиентов, где идентификатор всегда начинается с C - вы не хотите, чтобы все было в одном редукторе.

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