2012-06-20 17 views
8

Mam dwie oddzielne klasy Java do wykonywania dwóch różnych zadań mapreduce. Mogę je uruchomić niezależnie. Pliki wejściowe, na których działają, są takie same dla obu zadań. Więc moje pytanie brzmi: czy możliwe jest zdefiniowanie dwóch twórców map i dwa reduktory w jednej klasie java jakHadoop MapReduce: Możliwe zdefiniowanie dwóch maperów i reduktorów w jednej klasie zadań hadoop?

mapper1.class 
mapper2.class 
reducer1.class 
reducer2.class 

a następnie jak

job.setMapperClass(mapper1.class); 
job.setmapperClass(mapper2.class); 
job.setCombinerClass(reducer1); 
job.setCombinerClass(reducer2); 
job.setReducerClass(reducer1); 
job.setReducerClass(reducer2); 

Czy te określają metody faktycznie zastępują poprzednie lub dodać nowy te? Próbowałem kodu, ale uruchamia on tylko najnowsze, podane klasy, co powoduje, że myślę, że to zastępuje. Ale musi być sposób na robienie tego dobrze?

Powodem, dla którego o to pytam, jest to, że mogę odczytać pliki wejściowe tylko jeden raz (jedno wejście/wyjście), a następnie przetworzyć dwa zadania redukcji mapy. Chciałbym również wiedzieć, w jaki sposób mogę zapisać pliki wyjściowe w dwóch różnych folderach. W tej chwili oba zadania są oddzielne i wymagają katalogu wejściowego i wyjściowego.

Odpowiedz

1

Można użyć do tego wielu klas MultipleInput i MultipleOutputs, ale dane wyjściowe obydwu mapatorów zostaną przesłane do obu reduktorów. Jeśli dane przepływające przez dwie pary mapperów/reduktorów rzeczywiście są niezależne od siebie, zachowaj je jako dwa osobne zadania. Nawiasem mówiąc, MultipleInputs będzie uruchamiał twój program odwzorowujący bez zmian, ale reduktory będą musiały zostać zmodyfikowane, aby używać MultipleOutputs

+0

+1 Ma to sens. – pyfunc

+0

@ Chris Obie pary MR dzielą to samo wejście, co spowodowało, że pomyślałem, że mogę odczytać wejście tylko raz. Twórcy map działają z różnymi kluczami. Oznacza to, że klawisze dla jednego programu odwzorowującego będą różne od klawiszy dla innego programu odwzorowującego. Powodem, dla którego myślę, jest to, że mogę odczytać pliki wejściowe tylko raz, aby przetworzyć je w dwóch różnych parach MR, które pracują niezmiennie. – Bob

0

Zgodnie z moim rozumieniem, które wynika z używania map-reduce przy streamingu Hadoop, możesz połączyć wiele programy odwzorowujące i reduktory, w których jeden zużywa sygnał wyjściowy innego, ale nie powinno być w stanie jednocześnie uruchamiać różnych mapperów i reduktorów. Sami twórcy map są zależni od braku bloków do przetworzenia. Mapper powinien tworzyć instancję na podstawie tej decyzji, a nie dla różnych programów odwzorowujących dostępnych dla danego zadania.

[Edycja: Oparte na Twój komentarz]

nie sądzę, że jest to możliwe. Możesz łączyć się (gdzie reduktorzy będą otrzymywać wszystkie dane wejściowe od twórców map, możesz je sekwencjonować, ale nie możesz samodzielnie uruchamiać niezależnych zestawów mapperów i reduktorów ..

Myślę, że możesz zrobić, mimo że otrzymujesz oba dane wejściowe z mappers do obu twoich reduktorów, możesz sprawić, że twórcy map (K, V) będą w ten sposób mogli odróżnić w swoich reduktorach od tego, który element był pochodzenie (K, V). W ten sposób oba reduktory mogą przetwarzać na selektywne (k, v) par.

+0

@ Bob: Edytowałem swoją odpowiedź na podstawie Twojego komentarza – pyfunc

+0

Fajnie, nie myślałem o tym jako o możliwości. Ale jak mogę oddzielić pliki wyjściowe, powiedzmy, że mogę sobie z tym poradzić w mojej implementacji reduktora, muszę jakoś wtedy określić, które klucze są zapisywane w miejscu. – Bob

+0

Nie Bob: Nie możesz tego zrobić. Co możesz zrobić na mapie1, map2 to prześlij K, V jako K, (map1, V), aby w reduktorze wiedziałeś, skąd pochodzą dane. Każdy reduktor tworzy swój własny plik wyjściowy zadania, dzięki czemu twoje dane wyjściowe są już segregowane. – pyfunc

11

można mieć wiele twórców map, ale w jednej pracy, można mieć tylko jeden reduktor. i funkcje potrzebne są MultipleInput, MultipleOutput i GenericWritable.

Używając MultipleInput, możesz ustawić mapper i odpowiedni inputFormat. Oto mój post o tym, jak z niego korzystać.

Za pomocą GenericWritable można oddzielić różne klasy wejściowe w reduktorze. Oto mój post o tym, jak z niego korzystać.

Za pomocą MultipleOutput można wyprowadzać różne klasy w tym samym reduktorze.

+0

Thx za komentarz! Wypróbuję je. – Bob

0

Klasa ChainMapper pozwala korzystać z wielu klas Mapper w ramach jednego zadania Map. Na przykład spójrz na here.

Powiązane problemy