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
4 answers
Na poparcie wybranej odpowiedzi dodaję:
**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.]]**
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.
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.
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());
}
}
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