2013-08-26 10 views
9

Bei einem Job mit Map- und Reduce-Phasen kann ich sehen, dass der Output-Ordner Dateien wie "part-r-00000" enthält.Hadoop - Ergebnisse von Ausgabedateien nach Reduzierung erhalten?

Wenn ich diese Dateien auf Anwendungsebene nachbearbeiten muss, muss ich über alle Dateien im Ausgabeordner in natürlicher Namensreihenfolge iterieren (part-r-00000, part-r-00001, part-r-00002) ...) um Arbeitsergebnisse zu erhalten?

Oder ich kann einen Hadoop-Hilfsdatei-Leser verwenden, der es mir erlaubt, einen "Iterator" zu bekommen und die Dateiumschaltung für mich zu übernehmen (wenn die Datei part-r-00000 vollständig gelesen wird, fahre von Datei part-r-00001 fort)

Antwort

4

In mapreduce geben Sie einen Ausgabeordner an. Das einzige, was es enthält, sind Teil-R-Dateien (die Ausgabe einer Reduzierungsaufgabe) und eine _SUCCESS-Datei (die leer ist). Also ich denke, wenn Sie nachbearbeiten möchten, müssen Sie nur das Ausgabeverzeichnis von job1 als Eingabeverzeichnis für Job 2 festlegen.

Nun könnte es einige Anforderungen für Ihren Postprozessor, die adressiert werden können, ist es zum Beispiel wichtig um die Ausgabedateien in Reihenfolge zu verarbeiten?

Oder wenn Sie nur die Dateien lokal verarbeiten möchten, dann hängt alles vom Ausgabeformat Ihres MapReduce-Jobs ab. Dadurch erfahren Sie, wie die Teil-R-Dateien strukturiert sind. Dann können Sie einfach Standard-I/O verwenden, denke ich.

+0

Ich muss diese Dateien auf einen anderen Host und transform/Inhalt in die Datenbank einfügen. Ich kann diese Einfügung nicht auf der Reduzierungsstufe durchführen, da Cluster keinen Zugriff auf die Datenbank hat. – jdevelop

6

Sie können getmerge Befehl von Hadoop File System (FS) Shell verwenden:

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

Ich muss das in meinem Java-Code tun. – jdevelop

+0

@jdevelop: Sie können die copyMerge-Methode verwenden https://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/FileUtil.html – MicTech

1

Sie können sich wahrscheinlich Hadoop verwenden FileSystem die Iteration aus der Anwendung der Teil r-xxxxx-Dateien zu tun.

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()))); 
} 

können Sie auch in aussehen ChainMapper/ChainReducer.

+0

Ich suchte tatsächlich nach einer integrierten Implementierung für diese Funktionalität in Hadoop. – jdevelop

+0

Warum nicht von FileSystem verwenden [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) selbst, wenn Sie es in Ihrem lokalen Dateisystem haben wollen oder [FileUtils] (http://hadoop.apache.org/docs/current/api/org/ apache/hadoop/fs/FileUtil.html), wo Sie mehrere Methoden ausprobieren können? –

+0

Auf diese Weise muss ich mit ein paar Dateien umgehen. Idealerweise möchte ich einen HDFS-Pfad- und Datensatzleser angeben und einen Iterator von Datensätzen erhalten, ohne sich Gedanken darüber machen zu müssen, wie viele Dateien von Reducer erstellt wurden. – jdevelop

Verwandte Themen