2012-04-18 22 views
21

pracuję na pracy, która przetwarza zagnieżdżonej struktury katalogów zawierających pliki na wielu poziomach:Hadoop MapReduce zapewnić zagnieżdżonych katalogów jako wkład pracy

one/ 
├── three/ 
│   └── four/ 
│    ├── baz.txt 
│    ├── bleh.txt 
│    └── foo.txt 
└── two/ 
    ├── bar.txt 
    └── gaa.txt 

Kiedy dodać one/ jako drogi wejścia, żadne pliki nie są przetworzone, ponieważ żadne nie są natychmiast dostępne na poziomie katalogu głównego.

Przeczytałem o job.addInputPathRecursively(..), ale wydaje się, że zostały one wycofane w nowszych wydaniach (używam hadoop 1.0.2). Napisałem kod do chodzenia w folderach i dodawania każdego katalogu z job.addInputPath(dir), który działał, dopóki zadanie nie uległo awarii podczas próby przetworzenia katalogu jako pliku wejściowego z jakiegoś powodu, np. - próbuje fs.open(split.getPath()), gdy split.getPath() jest katalogiem (dzieje się to wewnątrz LineRecordReader.java).

Próbuję przekonać się, że musi istnieć prostszy sposób na zapewnienie pracy z zagnieżdżoną strukturą katalogów. Jakieś pomysły?

EDIT - podobno jest tam open bug.

+3

Czy korzystanie z 'FileSystem # listStatus()' jest tak trudne i dodawanie ich rekurencyjnie? –

+0

Rozwiązuję to w podobny sposób - napisałem kod rekursywny, który przemierza podkatalogi i dodaje wszystkie pliki do ścieżek wejściowych –

+1

@ThomasJungblut, to jest zasadniczo moje obecne podejście. Po prostu dziwne, że ta funkcjonalność nie jest wbudowana.Innym problemem, który mam, jest to, że hadoop zawiesza się, gdy uzyskuje dostęp do podfolderu bez żadnych plików, po prostu inne foldery (np. 'Jeden' ​​i' jeden/trzy' w moim przykładzie). Więc w zasadzie muszę zaimplementować logikę, która doda rekursywnie foldery, chyba że ** tylko ** mają w sobie inne foldery, zamiast plików (nadal muszą chodzić swoją zawartość, aby dodać zagnieżdżone pliki). Wygląda na to, że trudno jest założyć pracę. – sa125

Odpowiedz

4

Uważam, że rekurencyjne przeglądanie danych może być niebezpieczne, ponieważ mogą istnieć opóźnione pliki dziennika z pliku distcp lub podobnego. Pozwól mi zaproponować alternatywę:

Wykonaj spacer rekurencyjny w wierszu poleceń, a następnie przeprowadź ścieżki w parametrze rozdzielonym spacjami do programu MapReduce. Chwycić listę z argv:

$ hadoop jar blah.jar "`hadoop fs -lsr recursivepath | awk '{print $8}' | grep '/data.*\.txt' | tr '\n' ' '`" 

Przepraszam za długi bash, ale dostaje zadanie. Możesz zawinąć rzecz w skrypcie basha, aby podzielić rzeczy na zmienne.

Osobiście podoba mi się podejście do pisania po ścieżce do pisania moich zadań mapreduce, więc sam kod nie ma wytyczonych ścieżek i jest mi stosunkowo łatwo ustawić go tak, by działał na bardziej złożonej liście plików.

+0

Dzięki za to. Czy wiesz, czy jest jakikolwiek powód, aby zrobić to w ten sposób vs. FileInputFormat.addInputPaths ("plik oddzielony przecinkami od powyższego bash")? – dranxo

+0

Interesujące, z jakiego powodu? Jestem całkiem nowy w Hadoopie, ale wpadłem już na ten problem. – dranxo

-1

wystarczy użyć FileInputFormat.addInputPath ("ze wzorcem pliku"); Piszę mój pierwszy program hadoop do analizy wykresu, w którym dane wejściowe pochodzą z pliku diff w formacie .gz ... to działało dla mnie !!!

+0

używanie wzorca nazwy jest jednym ze sposobów uniknięcia problemu zagnieżdżonego katalogu. – hakunami

14

Nie znalazłem żadnego dokumentu na ten temat, ale działa */*. To jest -input 'path/*/*'.

+0

na pewno nie jest to rozszerzenie w bash (lub powłoki) i uruchamianie ton instancji hadoop? – jbu

+0

Mam pojedyncze cytaty wokół nich. – Cheng

+0

Uruchamianie 'ps -aux' pomogłoby usunąć problem wspomniany przez @jbu –

1

nie wiem, czy nadal aktualna, ale przynajmniej w Hadoop 2.4.0 można ustawić właściwość mapreduce.input.fileinputformat.input.dir.recursive do prawdziwej i będzie rozwiązać problem.

6

import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

FileInputFormat.setInputDirRecursive (zadanie, prawda);

Nie, dziękuję, zadzwoń do mnie LeiFeng!

+0

haha ​​Witaj LeiFeng, podobał mi się czytać pamiętnik :) – songyy