Подтвердить что ты не робот

Что такое использование компаратора группировки в карте Hasoop

Я хотел бы знать, почему группирующий компаратор используется во вторичном виде mapreduce.

В соответствии с окончательным примером руководства вторичной сортировки

Мы хотим, чтобы порядок сортировки для ключей был по годам (по возрастанию), а затем по температура (по убыванию):

1900 35°C
1900 34°C
1900 34°C
...
1901 36°C
1901 35°C

Установив разделитель для разбиения на часть года на год, мы можем гарантировать, что записи за тот же год идут на один и тот же редуктор. Этого еще недостаточно для достижения нашей цель, однако. Разделитель обеспечивает только то, что один редуктор получает все записи для год; он не меняет того факта, что редукторы группируются по ключевым разделам.

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

Заранее спасибо

4b9b3361

Ответ 1

В поддержку выбранного ответа я добавляю:

Следующее из это объяснение

Ввод

symbol time price
a      1    10
a      2    20
b      3    30

Вывод карты: создайте составной ключ\такие значения:

время символа-время

а-1         1-10

а-2         2-20

б-3         3-30

Разделитель: перенаправляет клавиши a-1 и a-2 на один и тот же редуктор, несмотря на то, что клавиши различны. Он также направит b-3 на отдельный редуктор.

GroupComparator: после того, как композитный ключ\значение достигнет редуктора вместо получателя, получающего

( а-1, {1-10})

( а-2, {2-20})

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

групповой компаратор обеспечит получение редуктора:

(а, { 1-10,2-20})

[[В одном вызове метода уменьшения.]]

Ответ 2

Позвольте мне улучшить утверждение: "... позаботьтесь о том, чтобы ключи вывода карты переходили к конкретному редуктору".

Экземпляр редуктора против метода уменьшения: Один JVM создается для задачи "Уменьшить", и каждый из них имеет один экземпляр класса Reducer. Это экземпляр Reducer (теперь я называю его "Редуктор" ). В каждом редукторе метод сокращения вызывается несколько раз в зависимости от "группировки клавиш". Каждый раз, когда вызывается сокращение, "valuein" имеет список выходных значений карты, сгруппированных по ключу, который вы определяете в "группирующем компараторе". По умолчанию компаратор группировки использует весь ключ вывода карты.

В этом примере клавиша вывода карты изменяется на "год и температура" для достижения сортировки. Если вы не определяете компаратор группировки, который использует только "годную" часть выходного ключа карты, вы не можете сделать все записи в том же году перейдите к тому же методу вызова метода сокращения.

Ответ 3

Вам нужно ввести промежуточный ключ, который является составной частью года и температуры; раздел на натуральный ключ (год) и ввести компаратор, который будет сортировать по всему составному ключу. Вы правы, что, разбив на год, вы получите все данные за год в одном и том же редукторе, поэтому компаратор будет эффективно сортировать данные за каждый год по температуре.

Ответ 4

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

public class SimplePartitioner implements Partitioner {
@Override
public int getPartition(Text compositeKey, LongWritable value, int numReduceTasks) {
    //Split the key into natural and augment
    String naturalKey = compositeKey.toString().split("separator")


    return naturalKey.hashCode();
}

}

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

public class SimpleGroupingComparator extends WritableComparator {

@Override
public int compare(Text compositeKey1, Text compositeKey2) {


return compare(compositeKey1.getNaturalKey(),compositeKey2.getNaturalKey());
}

}