2013-08-23 19 views

Odpowiedz

15

Grupowanie Komparator

Gdy dane osiąga reduktor, wszystkie dane są pogrupowane według klucza. Ponieważ mamy klucz złożony, musimy upewnić się, że rekordy są zgrupowane wyłącznie za pomocą klucza naturalnego. Można to osiągnąć, pisząc niestandardową GroupPartitioner. Mamy obiekt Comparator tylko z uwzględnieniem pola MonthMon z klasy TemperaturePair dla celów grupowania rekordów.

public class YearMonthGroupingComparator extends WritableComparator { 

    public YearMonthGroupingComparator() { 
     super(TemperaturePair.class, true); 
    } 

    @Override 
    public int compare(WritableComparable tp1, WritableComparable tp2) { 
     TemperaturePair temperaturePair = (TemperaturePair) tp1; 
     TemperaturePair temperaturePair2 = (TemperaturePair) tp2; 
     return temperaturePair.getYearMonth().compareTo(temperaturePair2.getYearMonth()); 
    } 
} 

Oto wyniki działa nasz wtórną ofertę sortowania:

new-host-2:sbin bbejeck$ hdfs dfs -cat secondary-sort/part-r-00000 

190101 -206

190102 -333

190103 -272

190104 -61

190105 -33

190110 -33

190111 -217

190112 -300

Podczas sortowania danych według wartości może nie być powszechną potrzebą, jest to ładne narzędzie, które ma w tylnej kieszeni w razie potrzeby. Ponadto mogliśmy głębiej przyjrzeć się wewnętrznym działaniom Hadoop, pracując z niestandardowymi partycjonerami i partycjonującymi grupami. Zobacz także ten link .. What is the use of grouping comparator in hadoop map reduce

+2

Aby uzyskać dodatkowe informacje .. http://codingjunkie.net/secondary-sort/ –

+0

jak działa sortowanie wtórne, jaki jest rzeczywisty przepływ z programu odwzorowującego do reduktora? – user1585111

+1

Dla zrozumienia ... odsyłam do tego linku http://answers.oreilly.com/topic/457-introduction-to-mapreduce-workflows/ –

15

Oto przykład grupowania. Zastanów się klucz złożony (a, b) i jego wartość v. I załóżmy, że po sortowaniu skończyć się, między innymi, z następującej grupy (klucz, wartość) pary:

(a1, b11) -> v1 
(a1, b12) -> v2 
(a1, b13) -> v3 

Z komparatora domyślne grupy ramy będzie wywołać funkcję reduce 3 razy dany (klucz , value), ponieważ wszystkie klucze są różne.Jeśli jednak udostępnisz własny niestandardowy komparator grupowy i zdefiniujesz go tak, aby zależał tylko od a, ignorując b, wówczas framework stwierdza, że ​​wszystkie klucze w tej grupie są równe i wywołuje funkcję zmniejszania tylko raz, używając następującego klucza i lista wartości:

(a1, b11) -> <v1, v2, v3> 

Należy pamiętać, że tylko pierwszy klucz kompozyt jest używany, i że B12 i B13 są „przegrane”, czyli nie przeszły do ​​reduktora.

w znanym przykład z książki „Hadoop” Computing max temperaturę na rok a jest rok, a b „s Temperatury są sortowane w kolejności malejącej, a tym samym b11 jest pożądana maksymalna temperatura, a ty nie dbaj o inne numery b. Funkcja redukcji po prostu zapisuje odebrane (a1, b11) jako rozwiązanie dla tego roku.

W twoim przykładzie z "bigdataspeak.com" wszystkie b są wymagane w reduktorze, ale są dostępne jako części odpowiednich wartości (obiektów) v.

W ten sposób, dodając swoją wartość lub jej część do klucza, można użyć Hadoop do sortowania nie tylko kluczy, ale także wartości.

Mam nadzieję, że to pomoże.

40

Ułatwia zrozumienie niektórych pojęć przy pomocy diagramów i to z pewnością jest jednym z nich.

Przyjmijmy, że nasze sortowanie wtórne znajduje się na złożonym kluczu złożonym z nazwiska i imienia.

Composite Key

Przy kluczu złożonym z drogi, teraz spójrzmy na wtórnym mechanizmem sortowania

Secondary Sorting Steps

partycjoner i zastosowanie komparatora grupa tylko naturalny klucz, partycjonowania używa go do przekazywania wszystkich rekordów z tym samym kluczem naturalnym do pojedynczego reduktora. Partycjonowanie odbywa się w fazie mapy, dane z różnych zadań map są odbierane przez reduktory, gdzie są zgrupowane, a następnie wysyłane do metody redukcji. To grupowanie jest miejscem, w którym kompilator grupowy pojawia się w obrazie, gdybyśmy mieli , a nie określić niestandardowy komparator grupowy, wówczas Hadoop użyłby domyślnej implementacji, która uwzględniałaby cały klucz złożony, co prowadziłoby do nieprawidłowych wyników.

Przegląd MR kroki

enter image description here

+0

Świetny schemat, dzięki. Czy możliwe jest użycie tej metody bez implementacji własnego kompresora grupującego? –

+0

Pięknie wyjaśniony. Czy pożyczyłeś to z jakiejś książki? Jeśli tak, czy mógłbyś wskazać mi książkę? Dzięki. – maddie

+0

Dzięki. Tak, pochodzi z [Hadoop in Practice] (https://www.manning.com/books/hadoop-in-practice-second-edition). Wydaje się, że druga edycja nieco się zmieniła. – Sudarshan

0

powyższych przykładach wzmianka mieć dobre wyjaśnienie, pozwól mi uprościć it.We trzeba wykonać trzy główne etapy.

  1. Mapout powinny być (klucz + Value, Value)
  2. Kiedy dołączyli Key & wartość. Nadal potrzebujemy mechanizmu do sortowania zarówno na oryginalnym kluczu, jak i na wartości. Abyśmy mogli dodać niestandardowy komparator.
  3. Teraz dane są posortowane na oryginalnym kluczu, ale jeśli wyślemy te dane do reduktora, nie zagwarantuje to wysłania całej wartości danego klucza do jednego reduktora, ponieważ używamy klucza jako klucza. Aby się upewnić, że dodamy komparator grupowy.
1

Partytor zapewnia, że ​​jeden reduktor otrzymuje wszystkie rekordy należące do klucza, ale nie zmienia to faktu, że reduktor grupuje kluczem w obrębie partycji.

W przypadku sortowania wtórnego tworzymy klucze złożone, a jeśli pozwolimy zachować zachowanie domyślne, logika grupowania będzie uwzględniać różne klucze.

Musimy więc kontrolować grupowanie. Dlatego musimy wskazać ramie grupę na podstawie naturalnej części klucza, a nie klucza złożonego. Dlatego komparator grupujący musi być użyty do tego samego.