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.
Czy korzystanie z 'FileSystem # listStatus()' jest tak trudne i dodawanie ich rekurencyjnie? –
Rozwiązuję to w podobny sposób - napisałem kod rekursywny, który przemierza podkatalogi i dodaje wszystkie pliki do ścieżek wejściowych –
@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