Что такое использование компаратора группировки в карте Hasoop
Я хотел бы знать, почему группирующий компаратор используется во вторичном виде mapreduce.
В соответствии с окончательным примером руководства вторичной сортировки
Мы хотим, чтобы порядок сортировки для ключей был по годам (по возрастанию), а затем по
температура (по убыванию):
1900 35°C
1900 34°C
1900 34°C
...
1901 36°C
1901 35°C
Установив разделитель для разбиения на часть года на год, мы можем гарантировать, что
записи за тот же год идут на один и тот же редуктор. Этого еще недостаточно для достижения нашей
цель, однако. Разделитель обеспечивает только то, что один редуктор получает все записи для
год; он не меняет того факта, что редукторы группируются по ключевым разделам.
Поскольку мы уже писали бы наш собственный разделитель, который позаботился бы о том, чтобы ключи выхода на карту переходили к конкретному редуктору, так почему мы должны группировать его.
Заранее спасибо
Ответы
Ответ 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());
}
}