Выход сортируется по ключу в пределах одного редуктора. Однако 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
- вы не хотите, чтобы все было в одном редукторе.
Можете ли вы подробнее рассказать? Можете ли вы дать некоторые данные, чтобы показать, что выход редуктора не отсортирован? –
Взгляните на http://stackoverflow.com/questions/33298159/difference-between-partial-sort-total-sort-and-secondary-sort-in-hadoop/33301253#33301253 и http: //blog.zaloni .com/вторичная сортировка в-Hadoop –