Hadoop jedna mapa i wiele redukcji

Mamy duży zbiór danych do analizy za pomocą wielu funkcji reduce .

Wszystkie algorytmy reducedziałają na tym samym zbiorze danych generowanym przez tę samą funkcję map. Odczytanie dużego zbioru danych kosztuje zbyt wiele, aby to zrobić za każdym razem, lepiej byłoby odczytać tylko raz i przekazać zmapowane DANE do wielu reduce funkcji.

Czy Mogę to zrobić z Hadoop? Przeszukałem przykłady i intarweb, ale nie mogłem znaleźć żadnych rozwiązań.

Author: gsamaras, 2010-02-25

6 answers

Czy spodziewasz się, że każdy reduktor będzie działał na dokładnie tych samych mapowanych danych? Ale przynajmniej "klucz" powinien być inny, ponieważ decyduje, który reduktor iść.

Możesz napisać wyjście dla wielu razy w maperze, A wyjście jako klucz (gdzie $i jest dla reduktora i-th, a $key jest Twoim oryginalnym kluczem). I musisz dodać "Partycjoner", aby upewnić się, że te N rekordy są dystrybuowane w reduktorach, na podstawie $i. następnie użyj "GroupingComparator" do grupowania rekordów według oryginału $key.

Jest to możliwe, ale nie w trywialny sposób w jednym MR.

 4
Author: Victor,
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
2010-02-26 05:07:50

Może prostym rozwiązaniem byłoby napisanie zadania, które nie ma funkcji reduce. Więc możesz przekazać wszystkie zmapowane dane bezpośrednio do wyjścia zadania. Wystarczy ustawić liczbę reduktorów na zero dla zadania.

Wtedy napisałbyś zadanie dla każdej innej funkcji redukcji, która działa na tych danych. Oznaczałoby to jednak przechowywanie wszystkich zmapowanych danych na HDFS.

Inną alternatywą może być połączenie wszystkich funkcji reduktora w jeden reduktor, który wyprowadza do wielu plików, używając innego wyjścia dla każdej innej funkcji. Wiele wyjść jest wymienionych w w tym artykule dla hadoop 0.19. Jestem prawie pewien, że ta funkcja jest zepsuta w nowym API mapreduce wydanym w wersji 0.20.1, ale nadal możesz jej używać w starszym API mapred.

 11
Author: Binary Nerd,
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
2010-02-26 22:33:04

Możesz używać kluczy złożonych. Powiedzmy, że potrzebujesz dwóch rodzajów reduktorów, " R1 " i "R2". Dodaj identyfikatory dla nich jako prefiks do kluczy o / p w maperze. Tak więc w maperze klucz " K "staje się teraz" R1: K " lub "R2: K".

Następnie, w reduktorze, przekazuje wartości do implementacji R1 lub R2 na podstawie prefiksu.

 3
Author: Sameer Joshi,
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
2011-03-30 18:06:58

Myślę, że chcesz uruchomić różne reduktory w łańcuchu. W hadoop "wiele reduktorów" oznacza uruchamianie wielu instancji tego samego reduktora. Proponuję uruchomić jeden reduktor na raz, zapewniając trywialną funkcję mapy dla wszystkich z wyjątkiem pierwszej. Aby zminimalizować czas transferu danych, można użyć kompresji.

 1
Author: trebuchet,
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
2011-04-27 10:17:45

Oczywiście można zdefiniować wiele reduktorów. Do pracy (Hadoop 0.20) wystarczy dodać:

job.setNumReduceTasks(<number>);
Ale. Twoja infrastruktura musi obsługiwać wiele reduktorów, co oznacza, że musisz
  1. mieć dostęp do więcej niż jednego procesora
  2. dostosuj mapred.tasktracker.zmniejsz.zadania.maksimum w mapred-site.XML
I oczywiście Twoja praca musi pasować do pewnych specyfikacji. Nie wiedząc, co dokładnie chcesz zrobić, mogę tylko dać szerokie porady:
  • Klucz map-output musi być albo dzielony przez % liczb lub musisz zdefiniować własny partycjoner: job.setPartitionerClass(...) na przykład z partycjonerem losowym ...
  • dane muszą być zredukowane w formacie partycjonowanym ... (potrzebne referencje?)

Otrzymasz wiele plików wyjściowych, po jednym dla każdego reduktora. Jeśli chcesz posortowane wyjście, musisz dodać kolejne zadanie odczytujące wszystkie pliki (tym razem wiele zadań mapowych ...) i pisząc je posortowane z tylko jeden reduktor ...

Przyjrzyj się też klasie Combiner, czyli Reduktorowi local . Oznacza to, że można agregować (redukować) już w pamięci na częściowe dane emitowane przez mapę. Bardzo dobrym przykładem jest WordCount-Example. Mapa emituje każde słowo jako klucz i jego ilość jako 1: (word, 1). Kombinator pobiera częściowe dane z mapy, emituje (,) lokalnie. Reduktor robi dokładnie to samo, ale teraz niektóre (połączone) wordcounty są już >1. Ratuje bandwith.

 0
Author: Leonidas,
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
2010-02-26 00:00:57

I still dont get your problem you can use following sequence:

Database-- > map-- > reduce (użyj cat lub None w zależności od wymagań) następnie zapisz wyodrębnioną reprezentację danych. jeśli mówisz, że jest wystarczająco mały, aby zmieścić się w pamięci, a następnie przechowywanie go na dysku nie powinno być problemem.

Również twoje użycie paradygmatu MapReduce dla danego problemu jest nieprawidłowe, używanie jednej funkcji map i wielu "różnych" funkcji reduce nie ma sensu, pokazuje, że jesteś wystarczy użyć mapy, aby przekazać dane różnym maszynom, aby zrobić różne rzeczy. nie potrzebujesz do tego hadoop ani żadnej innej specjalnej architektury.

 0
Author: ,
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
2010-02-28 06:10:31