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
Odpowiedz
Masz dwie wyraźne opcje:
mają dwa zadania mapreduce:
- WordCount: zlicza wszystkie wyrazy (dość dużo przykład dokładnie)
- 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.
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
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
Proszę wyjaśnić polecenie "sort -n -k2 -r | head-n20 ".. jak to jest n, k2 i r w poleceniu? – user3078014
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.
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
@halil, może mógłbyś polecić lepszą implementację? –
@halil wszelkie wyjaśnienia dla tego zjawiska byłyby pomocne –
Co masz na myśli mówiąc "nie chcę używać komendy hadoop dla tego prostego zadania"? –
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
Niepoprawnie. Reduktor nie sortuje wyjścia. Reduktor sortuje dane wejściowe od twórców map! Duża różnica! –