2013-12-14 13 views
11

Jestem bardzo nowy w świecie hadoopów i staram się osiągnąć jedno proste zadanie. Czy ktokolwiek może mi powiedzieć, jak uzyskać górne n wartości dla przykładu liczby słów przy użyciu techniki Map reduce codes? donot chce użyć dowolnego polecenia hadoop dla tego prostego zadania. Każdy pomysł lub sugestia naprawdę pomoże. Dzięki.Najlepsze wartości N według mapy Hadoop Zredukuj kod

+1

Co masz na myśli mówiąc "nie chcę używać komendy hadoop dla tego prostego zadania"? –

+1

W Hadoop, reduktor sortuje dane wyjściowe na podstawie wartości kluczy. Więc pisząc wynik, jeśli po prostu zamieniamy klucz i wartość, ja. e. Wpisz wartość (która będzie liczbą) jako klucz, a klucz jako wartość, a następnie posortuje na podstawie wartości. Następnie wystarczy uruchomić polecenie: hadoop fs -cat | tail -n gdzie n jest górnymi wartościami n, które chcesz poznać. Ale nie chcę używać powyższego polecenia, aby wykonać zadanie. Po prostu chcę to zrobić poprzez mapowanie tylko zmniejszania progamowania. – user3078014

+1

Niepoprawnie. Reduktor nie sortuje wyjścia. Reduktor sortuje dane wejściowe od twórców map! Duża różnica! –

Odpowiedz

18

Masz dwie wyraźne opcje:


mają dwa zadania mapreduce:

  1. WordCount: zlicza wszystkie wyrazy (dość dużo przykład dokładnie)
  2. TopN: praca MapReduce że znajduje górne N czegoś (oto kilka przykładów: source code, blog post)

Mieć wyjście programu WordCount do HDFS. Następnie, niech TopN odczyta to wyjście. Jest to nazywane połączeniem zadań i istnieje wiele sposobów rozwiązania tego problemu: oozie, skrypty bash, uruchamianie dwóch zadań od sterownika itp.

Powód, dla którego potrzebujesz dwóch zadań, robisz dwie agregacje: jedna jest liczba słów, a druga to topN. Zazwyczaj w MapReduce każda agregacja wymaga własnego zadania MapReduce.


Najpierw uruchom zadanie WordCount na danych. Następnie użyj bash, aby wyciągnąć górne N.

hadoop fs -cat /output/of/wordcount/part* | sort -n -k2 -r | head -n20 

sort -n -k2 -r mówi "sort numerycznie kolumnie nr 2, w kolejności malejącej". head -n20 ciągnie pierwszą dwudziestkę.

Jest to lepsza opcja dla WordCount, tylko dlatego, że WordCount będzie prawdopodobnie wyświetlał tylko dane rzędu tysięcy lub dziesiątków tysięcy linii i nie potrzebujesz do tego zadania MapReduce. Pamiętaj, że tylko dlatego, że masz już wokół siebie, nie oznacza to, że powinieneś rozwiązać wszystkie problemy z Hadoop.


Jeden nieoczywisty wersja, która jest trudne, ale połączenie obu powyższych ...

Napisz pracę WordCount MapReduce, ale w reduktor zrobić coś takiego w pracy TopN mapreduce I pokazałem ci wcześniej. Następnie każdy z reduktorów otrzymuje tylko wynik TopN z tego reduktora.

Tak więc, jeśli robisz Top 10, każdy reduktor wyświetli 10 wyników. Załóżmy, że masz 30 reduktorów, a otrzymasz 300 wyników.

Następnie zrobić to samo, co w opcji # 2 z bash:

hadoop fs -cat /output/of/wordcount/part* | sort -n -k2 -r | head -n10 

To powinno być szybsze, ponieważ jesteś postprocessingu tylko ułamek wyników.

To najszybszy sposób, w jaki mogę to zrobić, ale prawdopodobnie nie jest to warte wysiłku.

+0

Witaj Donald, Bardzo dziękuję za twoje rozwiązanie. Czy możesz mi powiedzieć, że to podejście jest również poprawne, które tutaj piszę ==> W Hadoop reduktor sortuje dane wyjściowe na podstawie wartości kluczy. Więc pisząc wynik, jeśli po prostu zamieniamy klucz i wartość, ja. e. Wpisz wartość (która będzie liczbą) jako klucz, a klucz jako wartość, a następnie posortuje na podstawie wartości. Następnie wystarczy uruchomić polecenie: hadoop fs -cat | tail -n gdzie n jest najwyższymi wartościami, które chcemy znać. – user3078014

+0

Musimy uruchomić dwie mapy, aby zmniejszyć liczbę zadań, aby wykonać to zadanie. Pierwsze zadanie, aby znaleźć normalne słowa i odpowiadające im liczby, a drugie zadanie polega na znalezieniu górnego N czegoś i, n górę od każdego reduktora. Nie jestem bardzo jasna druga praca w kodzie. Jak działa, a następnie, w jaki sposób uzyskujemy ostatecznie najwyższe wartości n ze wszystkich wyników reduktorów? W jaki sposób oblicza się najwyższą wartość za każdym razem, a następnie w końcu generuje dokładne górne wartości n? – user3078014

+0

Proszę wyjaśnić polecenie "sort -n -k2 -r | head-n20 ".. jak to jest n, k2 i r w poleceniu? – user3078014

2

Pobierz książkę MapReduce Design Patterns, aby zapoznać się ze sposobem rozwiązywania problemów w sposób MR. Here to kod z książki, aby uzyskać TopN.Sprawdź także Data-Intensive Text Processing with MapReduce, aby uzyskać więcej algorytmów.

+3

NIE używaj tego kodu topTendriver. używa TreeMap i zastępuje te same rekcje wartości int i nie oblicza wartości całkowitej, aby posortować je według poprawności. – halil

+0

@halil, może mógłbyś polecić lepszą implementację? –

+0

@halil wszelkie wyjaśnienia dla tego zjawiska byłyby pomocne –