2013-08-26 11 views
9

Biorąc pod uwagę pracę z mapą i zredukować fazy, widzę, że folder wyjściowy zawiera pliki o nazwach "part-r-00000".Hadoop - uzyskać wyniki z plików wyjściowych po zmniejszeniu?

Czy muszę przetwarzać te pliki na poziomie aplikacji, czy muszę wykonywać iteracje dla wszystkich plików w folderze wyjściowym w naturalnej kolejności nazywania (część-r-00000, część-r-00001, część-r-00002 ...) w celu uzyskania wyników pracy?

Albo mogę użyć jakiegoś programu do odczytu plików hadoop, który pozwoli mi uzyskać "iterator" i poradzić sobie z przełączaniem plików dla mnie (gdy plik part-r-00000 jest całkowicie odczytywany, kontynuuj z pliku part-r-00001)?

Odpowiedz

4

W mapreduce określasz folder wyjściowy, jedyne, co będzie zawierać, to pliki part-r (które są wynikiem zadania redukującego) oraz plik _SUCCESS (który jest pusty). Więc myślę, że jeśli chcesz zrobić postprocessing, musisz tylko ustawić katalog wyjściowy zadania1 jako katalog wejściowy dla zadania 2.

Teraz mogą istnieć pewne wymagania dla twojego postprocesora, które można rozwiązać, czy jest to na przykład ważne przetwarzać pliki wyjściowe w kolejności?

Jeśli chcesz po prostu przetworzyć pliki lokalnie, to wszystko zależy od formatu wyjściowego zadania mapreduce, dzięki temu dowiesz się, jak uporządkowane są pliki części-r. Wtedy możesz po prostu użyć standardowego i/o zgadywania.

+0

Potrzebuję pobrać te pliki na inny host i przekształcić/wstawić zawartość do bazy danych. Nie mogę wykonać tej wstawki na etapie zmniejszania, ponieważ klaster nie ma żadnego dostępu do bazy danych. – jdevelop

6

Można użyć getmerge dowodzenie Hadoop File System (FS) Obudowa:

hadoop fs -getmerge /mapreduce/job/output/dir/ /your/local/output/file.txt 
+0

Muszę to zrobić w moim kodzie Java. – jdevelop

+0

@jdevelop: możesz użyć metody copyMerge https://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/FileUtil.html – MicTech

1

Prawdopodobnie można użyć Hadoop FileSystem zrobić iteracji z aplikacji z plików niepełnym wymiarze R-xxxxx.

FileSystem fs = FileSystem.get(new Configuration()); 
FileStatus[] status = fs.listStatus(new Path("hdfs://hostname:port/joboutputpath")); 
for (int i=0;i<status.length;i++){ 
    fs.open(status[i].getPath()))); 
} 

Można również zajrzeć do ChainMapper/ChainReducer.

+0

Właściwie szukałem wbudowanej implementacji tej funkcji w Hadoop. – jdevelop

+0

Dlaczego nie używać z FileSystem [copyToLocal] (http://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/FileSystem.html#copyToLocalFile%28boolean,%20org.apache.hadoop.fs .Path,% 20org.apache.hadoop.fs.Path% 29), jeśli chcesz go mieć w lokalnym systemie plików lub może to być [FileUtils] (http://hadoop.apache.org/docs/current/api/org/ apache/hadoop/fs/FileUtil.html), gdzie masz kilka metod do wypróbowania? –

+0

W ten sposób mam do czynienia z kilkoma plikami. Idealnie chcę określić ścieżkę HDFS i czytnik rekordów oraz uzyskać iterator z rekordów bez obawy o to, ile plików zostało utworzonych przez reduktor. – jdevelop