Почему MRJob сортирует мои ключи?

Я запускаю довольно большое задание MRJob (1 755 638 ключей), и ключи записываются в редукторы в отсортированном порядке. Это произойдет, даже если я укажу, что Hadoop должен использовать разделитель хэшей, с:

class SubClass(MRJob):

    PARTITIONER = "org.apache.hadoop.mapred.lib.HashPartitioner"

...

Я не понимаю, почему ключи сортируются, когда я не прошу их сортировать.


person vy32    schedule 06.02.2017    source источник


Ответы (3)


HashPartitioner используется по умолчанию, если вы явно не указываете какой-либо разделитель.

person Rahul Sharma    schedule 07.02.2017

Ключи не сортируются по умолчанию, но HashPartitioner создаст внешний вид ключей сортировки, если набор данных небольшой. Когда я увеличил размер набора данных с 50M до 10G, ключи перестали сортироваться.

person vy32    schedule 07.03.2017
comment
Что это за хэш, когда он дает видимость сортировки!?! - person Dandelion; 19.12.2018
comment
Не знаю. Возможно, он даже не удосужился сортировать, учитывая, насколько маленьким на самом деле был мой довольно большой MRJob. - person vy32; 19.12.2018

MR сортирует пары ключ/значение по ключу, чтобы гарантировать, что все значения для данного ключа будут переданы редюсеру вместе. На самом деле, Iterable, переданный в метод reduce(), просто читает этот отсортированный список, пока не найдет новый ключ, а затем прекращает итерацию. Вот почему ключи всегда будут отображаться по порядку.

person Chris Gerken    schedule 07.02.2017
comment
Упоминается ли это где-нибудь в документах? Ваш ответ противоречит @vy32! - person Dandelion; 19.12.2018
comment
@Dandelion Сортировка не выполняется разделителем, который определяет, к какому разделу относится каждая пара ключ / значение. Сортировка происходит как часть предварительной обработки редуктора, так что ключи/значения группируются вместе для совместной передачи редуктору. - person Chris Gerken; 19.12.2018