Kiedy w Hadoop zaczynają się zadania redukcji? Czy zaczynają się po osiągnięciu określonego odsetka (progu) twórców map? Jeśli tak, czy ten próg jest ustalony? Jaki rodzaj progu jest zwykle używany?
Odpowiedzi:
Faza redukcji składa się z 3 etapów: tasowanie, sortowanie, zmniejszanie. Shuffle to miejsce, w którym dane są zbierane przez reduktor z każdego programu mapującego. Może się to zdarzyć, gdy twórcy map generują dane, ponieważ jest to tylko transfer danych. Z drugiej strony sortowanie i zmniejszanie można rozpocząć dopiero po zakończeniu wszystkich mapowań. Możesz stwierdzić, który MapReduce robi, patrząc na procent ukończenia redukcji: 0-33% oznacza, że wykonuje tasowanie, 34-66% to sortowanie, 67% -100% to redukcja. Dlatego czasami wydaje się, że Twoje reduktory „utknęły” na poziomie 33% - czekają na zakończenie mapowania.
Reduktory zaczynają tasować w oparciu o próg procentowy maperów, którzy skończyli. Możesz zmienić parametr, aby reduktory uruchamiały się wcześniej lub później.
Dlaczego wczesne uruchomienie reduktorów jest dobrą rzeczą? Ponieważ rozkłada transfer danych z maperów do reduktorów w czasie, co jest dobrą rzeczą, jeśli wąskim gardłem jest twoja sieć.
Dlaczego wczesne uruchamianie reduktorów jest złą rzeczą? Ponieważ „zawijają” redukują liczbę miejsc, kopiując tylko dane i czekając na zakończenie mapowania. Inna praca, która zaczyna się później i która faktycznie będzie wykorzystywała pola redukcji, teraz nie może ich używać.
Możesz dostosować czas uruchamiania reduktorów, zmieniając domyślną wartość mapred.reduce.slowstart.completed.maps
w mapred-site.xml
. Wartość 1.00
will czekać na zakończenie wszystkich maperów przed uruchomieniem redukcji. Wartość od 0.0
razu uruchomi reduktory. Wartość 0.5
uruchomi redukcje, gdy połowa maperów zostanie ukończona. Możesz także zmieniać mapred.reduce.slowstart.completed.maps
poszczególne zadania. W nowych wersjach Hadoop (przynajmniej 2.4.1) parametr nazywa sięmapreduce.job.reduce.slowstart.completedmaps
(dzięki użytkownikowi yegor256).
Zazwyczaj wolę trzymać się mapred.reduce.slowstart.completed.maps
powyżej, 0.9
jeśli system ma kiedykolwiek uruchomionych wiele zadań jednocześnie. W ten sposób zadanie nie blokuje reduktorów, gdy nie robią nic poza kopiowaniem danych. Jeśli w danym momencie wykonywana jest tylko jedna praca, 0.1
prawdopodobnie byłoby to właściwe.
Faza redukcji może rozpocząć się na długo przed wywołaniem reduktora. Jak tylko "mapper" zakończy zadanie, wygenerowane dane są sortowane i tasowane (co obejmuje wywołanie sumatora i partycjonera). „Faza” reduktora uruchamia się w momencie rozpoczęcia przetwarzania danych po mapowaniu. Po zakończeniu przetwarzania zobaczysz postęp w procentach redukcji. Jednak żaden z reduktorów nie został jeszcze wezwany. W zależności od liczby dostępnych / używanych procesorów, charakteru danych i liczby oczekiwanych reduktorów, możesz chcieć zmienić parametr zgodnie z opisem @ Donald-miner powyżej.
O ile rozumiem, faza redukcji zaczyna się od fazy mapy i nadal zużywa rekord z map. Jednak ponieważ po fazie mapowania występuje faza sortowania i tasowania, wszystkie wyjścia muszą zostać posortowane i wysłane do reduktora. Więc logicznie można sobie wyobrazić, że faza redukcji zaczyna się dopiero po fazie mapy, ale w rzeczywistości ze względu na wydajność reduktory są również inicjowane z mapowaniem.
Procent pokazany dla fazy redukcji jest w rzeczywistości ilością danych skopiowanych z map wyjściowych do katalogów wejściowych reduktorów. Aby wiedzieć, kiedy zaczyna się to kopiowanie? Jest to konfiguracja, którą możesz ustawić, jak pokazał Donald powyżej. Gdy wszystkie dane zostaną skopiowane do reduktorów (tj. 100% redukcji), wtedy reduktory zaczną działać i może się zawiesić w „100% redukcji”, jeśli twój kod reduktorów jest obciążony we / wy lub procesor.
Rozważmy przykład WordCount, aby lepiej zrozumieć, jak działa zadanie redukcji mapy. Załóżmy, że mamy duży plik, powiedzmy, a naszym zadaniem jest znaleźć, ile razy każde słowo występuje w pliku. Ponieważ plik jest duży, można go podzielić na różne bloki i replikować w różnych węzłach roboczych. Zadanie zliczania słów składa się z map i zadań redukcji. Zadanie mapy przyjmuje jako dane wejściowe każdy blok i tworzy pośrednią parę klucz-wartość. W tym przykładzie, ponieważ liczymy liczbę wystąpień słów, mapper podczas przetwarzania bloku dałby pośrednie wyniki postaci (słowo1, liczba1), (słowo2, liczba2) itd. Wyniki pośrednie wszystkich maperów to przeszedł przez fazę tasowania, która zmieni kolejność wyniku pośredniego.
Załóżmy, że nasze dane wyjściowe map z różnych maperów mają następującą postać:
Mapa 1: - (jest, 24) (była, 32) (i, 12)
Mapa2: - (mój, 12) (jest, 23) (był, 30)
Dane wyjściowe mapy są sortowane w taki sposób, że te same wartości kluczy są przekazywane do tego samego reduktora. Tutaj oznaczałoby to, że klawisze odpowiadające is, was etc idą do tego samego reduktora. To reduktor produkuje końcowe wyjście, które w tym przypadku byłoby: - (i, 12) (is, 47) (my, 12 ) (była, 62)
Zadania reduktora rozpoczynają się dopiero po zakończeniu completion
wszystkich maperów.
Ale transfer danych odbywa się po each
Map. W rzeczywistości jest to operacja ciągnięcia.
Oznacza to, że za każdym razem reduktor zapyta każde zadanie mapy, czy ma jakieś dane do pobrania z mapy.Jeśli znajdzie któryś z maperów wykonał swoje zadanie, Reducer pobierze dane pośrednie.
Dane pośrednie z Mappera są przechowywane w disk
. Transfer danych z Mappera do Reduce odbywa się przez sieć ( Data Locality
nie jest zachowywany w fazie Reduce)