2013-11-20 18 views
6

Uso Cloudera Hadoop. Sono in grado di eseguire un semplice programma mapreduce in cui fornisco un file come input per il programma MapReduce.Hadoop: Fornire la directory come input per il lavoro MapReduce

Questo file contiene tutti gli altri file da elaborare con la funzione mapper.

Ma sono bloccato a un certo punto.

/folder1 
    - file1.txt 
    - file2.txt 
    - file3.txt 

Come posso specificare il percorso di ingresso al programma di MapReduce come "/folder1", in modo che possa iniziare l'elaborazione di ogni file all'interno di questa directory?

Qualche idea?

EDIT:

1) Intiailly, ho fornito l'inputFile.txt come input al programma MapReduce. Funzionava perfettamente.

>inputFile.txt 
file1.txt 
file2.txt 
file3.txt 

2) Ma ora, invece di dare un file di input, voglio fornire una directory di input come arg [0] sulla riga di comando.

hadoop jar ABC.jar /folder1 /output 
+0

come stai presentando/creare il lavoro? –

+0

Controlla le modifiche ..... –

+0

Sì, funziona così, qual è la tua domanda? –

risposta

2

si potrebbe usare FileSystem.listStatus per ottenere l'elenco dei file da data dir, il codice potrebbe essere come di seguito:

//get the FileSystem, you will need to initialize it properly 
FileSystem fs= FileSystem.get(conf); 
//get the FileStatus list from given dir 
FileStatus[] status_list = fs.listStatus(new Path(args[0])); 
if(status_list != null){ 
    for(FileStatus status : status_list){ 
     //add each file to the list of inputs for the map-reduce job 
     FileInputFormat.addInputPath(conf, status.getPath()); 
    } 
} 
+0

dopo aver aggiunto il percorso come possiamo accedervi nel lavoro di mappa? restituirà direttamente il contenuto dei file? –

11

Il problema è FileInputFormat non legge i file in modo ricorsivo nella directory percorso di ingresso.

Soluzione: Usa Seguendo codice

FileInputFormat.setInputDirRecursive(job, true); Prima linea qui sotto nella tua Mappa ridurre il codice

FileInputFormat.addInputPath(job, new Path(args[0]));

È possibile controllare here per quale versione è stato risolto.

1

è possibile utilizzare HDFS wildcards al fine di fornire più file

Quindi, la soluzione:

hadoop jar ABC.jar /folder1/* /output 

o

hadoop jar ABC.jar /folder1/*.txt /output 
0

Usa MultipleInputs classe.

MultipleInputs. addInputPath(Job job, Path path, Class<? extends InputFormat> 
inputFormatClass, Class<? extends Mapper> mapperClass) 

Dai un'occhiata alla lavorazione code

Problemi correlati