Какая польза от компаратора группировки в карте Hadoop?

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

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

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

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

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

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

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


person Pramod    schedule 06.02.2013    source источник


Ответы (4)


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

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

**Input**:

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

**Map output**: create composite key\values like so:

> symbol-time time-price
>
>**a-1**         1-10
>
>**a-2**         2-20
>
>**b-3**         3-30

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

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

>(**a-1**,{1-10})
>
>(**a-2**,{2-20})

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

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

(a-1,{**1-10,2-20**})

Ключом сгруппированных значений будет тот, который стоит первым в группе. Это можно контролировать с помощью Key Comparator.

**[[In a single reduce method call.]]**
person jakstack    schedule 01.11.2013
comment
моя работа по уменьшению карты не использует мой компаратор группировки, она использует метод сравнения составного ключа с методом. в группу Любая идея, почему это происходит? - person Satya Nand kanodia; 11.12.2018

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

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

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

person Eswara Reddy Adapa    schedule 07.02.2013
comment
Можете ли вы объяснить свой ответ с помощью имеющегося сценария, взяв более простой пример с подсчетом слов. то, что я ищу, - это функционирование всей работы на системном уровне. Также одно сомнение: можем ли мы сгруппировать ключи, переданные в один редуктор, по какому-то параметру, скажем, для этого случая: температуры всех воскресений из данных, передаваемых в редуктор за 2013 год. - person Milind Jindal; 24.04.2013

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

person Mike DeLong    schedule 07.02.2013

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

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());
}

}

person Sambit Tripathy    schedule 19.06.2014