2013-06-21 7 views
8

Po pierwsze, jestem nowy na Hadoop :)Running Map-Reduce pracę na konkretnych plików/bloków w HDFS

Mam duży zestaw danych pliki spakowane gzipem (TBS dokumentów w pliki spakowane gzipem wokół wielkości 100-500mb każdy).

Zasadniczo potrzebuję jakiegoś filtrowania moich danych wejściowych do mojej mapy - zmniejsz liczbę zadań.

Chcę analizować te pliki na różne sposoby. Wiele z tych zadań wymaga jedynie analizy plików o określonym formacie (pewnej długości, zawierających określone słowa itp. - wszystkie rodzaje dowolnych (odwróconych) indeksów), a przetwarzanie całego zestawu danych dla każdego zadania zajmuje nieracjonalnie dużo czasu. Dlatego chcę utworzyć indeksy wskazujące konkretne bloki/pliki w HDFS.

Potrafię ręcznie wygenerować wymagane indeksy, ale jak dokładnie określić, które (tysiące) konkretnych plików/bloków, które chcę przetworzyć jako dane wejściowe dla twórców map? Czy mogę to zrobić bez odczytywania danych źródłowych do np. HBase? Czy chcę? Czy też całkowicie rozwiązałem ten problem?

+0

Więc jeśli dobrze rozumiem, szukasz sposobu na przetwarzanie tylko podzbioru plików w ścieżce wejściowej? Jak programujesz zadania, programowo? – climbage

+0

W jaki sposób kierowanie bloków HDFS zamiast uruchamiania różnych zadań dla różnych formatów (plików) sprawi, że zadanie stanie się szybsze? Czy możesz rozwinąć swoje pytanie bardziej? –

+0

Przepraszamy za bycie tak niejasnym. Nie czuję się jeszcze jak w domu na stosie maczków, więc wiem, że moja terminologia i sposób myślenia jest nieznaczny. Poniższy przykład może pomóc wyjaśnić, co próbuję osiągnąć: biorąc pod uwagę 1 000 000 plików i indeks dokładnie informujący, które pliki 5000 zawierają słowo * słońce *, uruchom mapę - zmniejsz liczbę zadań, która analizuje wszystkie dokumenty zawierające słowa * słońce * . – jkgeyti

Odpowiedz

2

Zakładając, że masz jakiś sposób, dzięki któremu dowiesz się, które pliki x przetwarzać w dużym korpusie plików, podczas konfigurowania pracy możesz użyć metody org.apache.hadoop.mapreduce.lib.input.FileInputFormat.setInputPathFilter(Job, Class<? extends PathFilter>).

Będziesz musiał zdać klasę, która implementuje PathFilter. Hadoop utworzy nowe wystąpienie tej klasy i zostanie przedstawione, który z plików w korpusie za pomocą metody boolean accept(Path path). Możesz użyć tego do filtrowania plików do rzeczywistych zadań mapowania procesów (niezależnie od tego, czy plik jest oparty na nazwie pliku, rozmiarze, ostatnio zmodyfikowanym znaczniku czasowym itp.).

Aby skierować określone bloki, musisz zaimplementować własne rozszerzenie FileInputFormat, w szczególności przesłonięcie metody getSplits. Ta metoda używa metody listStatus do określenia, które pliki wejściowe mają przetwarzać (i gdzie jest przywoływany wcześniej filtr PathFilter), po czym następnie decyduje, jak podzielić te pliki na podziały (jeśli pliki można podzielić na warstwy). Tak więc w tej metodzie getSplits musisz ponownie użyć swoich danych referencyjnych do kierowania na konkretne podziały, które Cię interesują.

Jeśli chodzi o przechowywanie/pobieranie tego pliku docelowego i dzieli informacje, masz kilka możliwości przechowywania danych trwałości, takich jak jako magazyn klucza/wartości (HBase, jak zauważyłeś w swoim pytaniu), osobna baza danych (MySQL, itp.), odwrócony indeks (Lucene) itd.

1

Uruchamianie mapy - zmniejszanie pracy w określonych plikach w HDFS oznacza filtr plik wejściowy na podstawie pewnych kryteriów. Here to dobry blog opublikowany przez Antoine Amend, będzie pomocny.

2

Ponieważ chcesz filtrować dane wejściowe na podstawie zawartości pliku (plik zawierający słowo foobar), a nie metadane pliku (nazwa/rozmiar pliku itp.), Potrzebowałbyś rodzaju indeksów, które utworzyłem na podstawie na Hadoop InputSplit. Patrz: my blog

+0

Fajnie. Od tego momentu, zadając to pytanie, zbudowałem podobną konfigurację. Cieszę się, że dodałeś benchmarki, spróbuję porównać moje nieco inne podejście do twojego. Czy masz dokładny przykład tego, jak wyglądają twoje dane, więc mogę wygenerować coś podobnego do testu porównawczego? – jkgeyti