2012-08-22 13 views
6

Jak mogę wysłać konkretny rekord do wszystkich moich reduktorów?Hadoop wysłać rekord do wszystkich reduktorów

Znam klasę Partitioner i co robi, ale nie widzę łatwego sposobu upewnienia się, że rekord trafia do wszystkich reduktorów.

Zasadniczo partycjonowania ma tę metodę:

int getPartition(K2 key, 
      V2 value, 
      int numPartitions) 

Moim pierwszym pomysłem było mieć partycjonowania i odwzorowującego współpracować następująco: Mapper utrzymuje wyprowadzania rekord kilkakrotnie równą liczbę zmniejszyć zadania i Partitioner zwraca wszystkie ints (od 0 do numPartitions-1), tym samym upewniając się, że rekord dociera do wszystkich partycji.

Czy istnieją inne, mądrzejsze sposoby rozwiązania tego problemu? Na przykład zwracam -1 dla rekordów, które muszę wysłać do wszystkich partycji, a framework robi to dla mnie, gdy widzi zwrócony -1.

Odpowiedz

5

The partitioner nie działa w ten sposób. Jego zadaniem jest spojrzenie na klucz (zwykle) i wartość (rzadko), aby określić, do którego reduktora należy wysłać parę. Dzieje się tak po mapperie i przed reduktorem.

Zamiast tego użytkownik (program odwzorowujący) powinien być w stanie zapytać kontekst dla konfiguracji, która może odpowiedzieć na całkowitą liczbę reduktorów (partycji). Twój program odwzorowujący może następnie wygenerować złożony klucz zawierający właściwy klucz i numer partycji. Wiesz ile razy to zapisać, ponieważ program odwzorowujący może znaleźć liczbę reduktorów (patrz wyżej). Musi to być podział wartości klucza złożonego, wyodrębnienie docelowego indeksu reduktora i zwrócenie tego indeksu.

Nawiasem mówiąc, oznacza to, że jeśli używasz tej techniki do wysyłania liczników (jeśli sortujesz) lub innych metadanych, które będą używane później w przetwarzaniu, wtedy twoje prawdziwe klucze danych muszą być zgodne z tym samym złożeniem format. W rzeczywistości prawdopodobnie będziesz musiał umieścić w kluczu złożonym wskaźnik opisujący rodzaj pary klucz/wartość (np. 1 = rzeczywiste dane, 0 = przetwarzanie metadanych).

+0

Muszę również zaktualizować tę odpowiedź w odniesieniu do komparatora grupującego, którego będziesz potrzebować. –

+0

Tak też myślałem. Nie opisałem tego bardzo wyraźnie i myślałem także o liczniku w obiekcie Partitioner, aby śledzić, co to jest następna partycja, którą ma zwrócić. Jednak nie jestem pewien, jest to rozwiązanie, ponieważ obiekt Partitioner może być GC-ed i resetowanie licznika. Jeśli chodzi o komparator grupowy, myślę, że to zależy od moich wymagań, których nie opisałem. W razie potrzeby wrócę. Dzięki! – Razvan

Powiązane problemy