2013-08-26 10 views
9

Dato un lavoro con la mappa e ridurre le fasi, posso vedere che la cartella di output contiene file chiamati "part-r-00000".Hadoop: ottieni risultati dai file di output dopo la riduzione?

Se ho bisogno di post-processare questi file a livello di applicazione, è necessario scorrere tutti i file nella cartella di output in ordine di denominazione naturale (part-r-00000, part-r-00001, part-r-00002 ...) per ottenere risultati di lavoro?

Oppure posso usare qualche lettore di file hadoop helper, che mi permetterà di ottenere un "iteratore" e gestire il cambio di file per me (quando il file part-r-00000 è completamente letto, continua dal file part-r-00001)?

risposta

4

In mapreduce si specifica una cartella di output, l'unica cosa che conterrà saranno i file part-r (che è l'output di un'attività di riduzione) e un file _SUCCESS (che è vuoto). Quindi penso che se vuoi fare postelaborazione devi solo impostare la directory di output di job1 come dir di input per il lavoro 2.

Ora potrebbero esserci dei requisiti per il tuo postprocessore che possono essere indirizzati, è per esempio importante elaborare i file di output in ordine?

Oppure, se si desidera elaborare i file localmente, tutto dipende dal formato di output del lavoro mapreduce, questo vi dirà come sono strutturati i file part-r. Quindi puoi usare semplicemente i/o standard, credo.

+0

Ho bisogno di ottenere questi file su un altro host e trasformare/inserire il contenuto nel database. Non riesco a farlo inserto in fase di riduzione perché il cluster non ha accesso al database. – jdevelop

6

È possibile utilizzare il comando di shell getmerge di Hadoop File System (FS):

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

Ho bisogno di farlo nel mio codice Java. – jdevelop

+0

@jdevelop: è possibile utilizzare il metodo copyMerge https://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/FileUtil.html – MicTech

1

Probabilmente si può usare Hadoop FileSystem per fare l'iterazione dall'applicazione dei file part-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()))); 
} 

si può anche guardare in ChainMapper/ChainReducer.

+0

In realtà stavo cercando un'implementazione integrata per questa funzionalità in Hadoop. – jdevelop

+0

Perché non utilizzare da 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) stesso se lo si desidera nel proprio filesystem locale o potrebbe essere [FileUtils] (http://hadoop.apache.org/docs/current/api/org/ apache/hadoop/fs/FileUtil.html), dove hai diversi metodi da provare? –

+0

In questo modo devo gestire un paio di file. Idealmente, voglio specificare il percorso HDFS e il lettore di record e ottenere l'iteratore dei record senza preoccuparmi di quanti file sono stati creati da reducer. – jdevelop

Problemi correlati