Jakie jest zastosowanie komparatora grupującego w hadoop map reduce

Chciałbym wiedzieć, dlaczego komparator grupowania jest używany w drugorzędnym rodzaju mapreduce.

Zgodnie z definitywnym przewodnikiem przykład sortowania wtórnego

Chcemy, aby kolejność sortowania kluczy była według roku (rosnąco), a następnie według temperatura (malejąco):

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

Ustawiając partycjoner na partycję według roku części klucza, możemy zagwarantować, że rekordy za ten sam rok idą do tego samego reduktora. To wciąż nie wystarczy, aby osiągnąć nasze Gol, jednak. A partycjoner zapewnia tylko, że jeden reduktor otrzymuje wszystkie zapisy dla roku; nie zmienia to faktu, że reduktor grupuje się według klucza w obrębie partycji.

Skoro już napisalibyśmy własny partycjoner, który dbałby o klucze wyjściowe mapy przechodzące do konkretnego reduktora, to dlaczego mielibyśmy je grupować.

Z góry dzięki

Author: Nickolay, 2013-02-06

4 answers

Na poparcie wybranej odpowiedzi dodaję:

Po to Wyjaśnienie

**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

Partycjoner: poprowadzi klucze a-1 i a-2 do tego samego reduktora, mimo że klucze są różne. Będzie również kierować b-3 do oddzielnego reduktora.

GroupComparator : gdy do reduktora zamiast reduktora dojdzie klucz\wartość]}

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

powyższe nastąpi ze względu na unikalne wartości klucza następujące skład.

Komparator Grupowy zapewni reduktorowi:

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

Kluczem grupowanych wartości będzie ten, który jest pierwszy w grupie. Można to kontrolować za pomocą komparatora kluczowego.

**[[In a single reduce method call.]]**
 33
Author: jakstack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-20 07:39:24

Pozwól mi poprawić stwierdzenie"... zadbaj o klucze wyjściowe mapy przechodzące do konkretnego reduktora".

Instancja reduktora a metoda reduktora: Jeden JVM jest tworzony na zadanie Reduce, a każde z nich ma pojedynczą instancję klasy Reducer.Jest to przykład reduktora (od teraz nazywam go reduktorem).W obrębie każdego reduktora metoda redukcji jest wywoływana wielokrotnie w zależności od "grupowania kluczowego".Za każdym razem, gdy wywoływane jest reduce, 'valuein' ma listę wartości wyjściowych map pogrupowanych według klucza zdefiniowanego w 'komparator grupowania'. domyślnie komparator grupowania używa całego klucza wyjściowego mapy.

W przykładzie klucz wyjściowy map jest zmieniany na 'rok i temperatura' w celu osiągnięcia sortowania.Jeśli nie zdefiniujesz komparatora grup, który używa tylko części "rok" klucza wyjściowego mapy,nie możesz sprawić, aby wszystkie rekordy z tego samego roku przeszły do tego samego wywołania metody redukuj.

 23
Author: Eswara Reddy Adapa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-07 05:53:07

Musisz wprowadzić klucz pośredni, który jest złożonym kluczem roku i temperatury; partycja na kluczu naturalnym (roku) i wprowadzić komparator, który będzie sortował na całym kluczu złożonym. Masz rację, że dzieląc na rok otrzymasz wszystkie dane za rok w tym samym reduktorze, więc komparator skutecznie posortuje dane za każdy rok według temperatury.

 2
Author: Mike DeLong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-07 03:19:29

Domyślny partycjoner oblicza hash klucza, a te klucze, które mają tę samą wartość, zostaną wysłane do tego samego reduktora. Jeśli masz złożony(naturalny+augment) klucz wysłany w maperze i jeśli chcesz wysłać klucze, które mają ten sam naturalny klucz do tego samego reduktora, musisz zaimplementować Niestandardowy partycjoner.

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

}

I teraz, jeśli chcesz, aby wszystkie Twoje odpowiednie wiersze w partycji danych były wysyłane do jednego reduktora {[8] } musisz również zaimplementuj komparator grupujący, który bierze pod uwagę tylko klucz naturalny

public class SimpleGroupingComparator extends WritableComparator {

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


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

}

 1
Author: Sambit Tripathy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-19 23:56:06