2013-04-11 14 views
5
Mapper/Reducer 1 --> (key,value) 
        / | \ 
        / | \ 
    Mapper/Reducer 2  | Mapper/Reducer 4 
    -> (oKey,oValue)  | -> (xKey, xValue) 
          | 
          | 
        Mapper/Reducer 3 
        -> (aKey, aValue) 

Mam plik dziennika, który agreguję z MR1. Mapper2, Mapper3, Mapper4 pobiera dane wyjściowe MR1 jako dane wejściowe. Zadania są powiązane.Hadoop - jak używać i zmniejszać wiele wejść?

MR1 wyjściowa:

User  {infos of user:[{data here},{more data},{etc}]} 
.. 

MR2 wyjściowa:

timestamp  idCount 
.. 

MR3 wyjściowa:

timestamp  loginCount 
.. 

MR4 wyjściowa:

timestamp  someCount 
.. 

chcę połączyć wyjścia z MR2-4: Final output->

timestamp  idCount  loginCount someCount 
.. 
.. 
.. 

Czy istnieje sposób, w/o świni lub ula? Używam Java.

+1

+1 dla samej sztuki ASCII .. –

+0

Czy w drugim kroku nie można wykonać wielofunkcyjnego zadania MR, ponieważ wszystkie klucze są sygnaturami czasowymi? To znaczy. interpretować wartość, która została przekazana i odpowiednio ją obsłużyć? Widząc, że reduktory mają zagwarantowane otrzymywanie wszystkich wartości dla danego klucza, możesz zebrać wszystkie informacje związane ze znacznikiem czasu i zapisać je tylko wtedy, gdy masz wszystkie potrzebne komponenty. – Quetzalcoatl

+0

Właściwie to zrobiłem i zadziałało. Pojawiło się jedno pytanie: Aby osiągnąć to, co chciałem, napisałem 3 razy w funkcji mapy do kontekstu (context.write (key1, value1) - głębiej w code context.write (key2, value2) oraz w kontekście końcowym. write (key3, value3) Czy to możliwe? – JustTheAverageGirl

Odpowiedz

1

O ile mi wiadomo, nie można mieć tablicę w klasie wyjście reduktora. co przychodzi mi do głowy, aby rozwiązać swój problem jest następujący:

Klucz wyjście MR1 będzie jednym {a,b,c} i wartości jest para wśród {timestamp,idCount} lub {timestamp, loginCount} lub {timestamp, someCount} według kluczy. I połączysz MR2-4.

więc proces będzie tak:

MR1 <inputKey,inputValue,outputKey,outPutValue> where outputKey is 
             "a" for outValue`{timestamp,idCount} 
             "b" for outValue`{timestamp, loginCount} 
             "c" for outValue`{timestamp, someCount} 

MR2-4<inputKey,inputValue,outputKey,outPutValue> if inputkey is "a" do MR2 
               if inputkey is "b" do MR3 
               if inputkey is "c" do MR4 

Ponadto, istnieją metody zwane Partitioner and GroupComperator, w którym można grać z {klucz/wartość} i mapper/reduktor może rozważyć key+some_part_of_value jako klucza.