2011-01-17 34 views
19

Esiste un'API HDFS in grado di copiare un'intera directory locale su HDFS? Ho trovato un'API per copiare i file ma ce n'è una per le directory?Hadoop copia una directory?

risposta

15

Utilizzare Hadoop FS shell. In particolare:

$ hadoop fs -copyFromLocal /path/to/local hdfs:///path/to/hdfs 

Se si vuole fare a livello di codice, creare due filesystem (uno locale e uno HDFS) e utilizzare the FileUtil class

+0

ho bisogno di fare questo programma. non dalla shell – rakeshr

+0

ok, ho aggiunto come farlo usando FileUtil. –

+0

Can hadoop fs supporta la copia da una condivisione file? Non riesco mai a farlo – machinarium

10

Ho provato a copiare dalla directory usando

/hadoop/core/bin/hadoop fs -copyFromLocal /home/grad04/lopez/TPCDSkew/ /export/hadoop1/lopez/Join/TPCDSkew 

Dava un errore che dice che Target è una directory. L'ho quindi modificato in

/hadoop/core/bin/hadoop fs -copyFromLocal /home/grad04/lopez/TPCDSkew/*.* /export/hadoop1/lopez/Join/TPCDSkew 

funziona.

+1

Questo è in riferimento alla versione hadoop 0.20. – LGG

+2

questo problema è stato risolto e questa notazione non è più necessaria. Tuttavia l'OP non ha specificato una versione hadoop in modo che questa risposta possa ancora essere applicata alle vecchie versioni. – Tommy

0

Per il programmatore, è possibile utilizzare anche copyFromLocalFile. Ecco un esempio:

import org.apache.hadoop.conf.Configuration 
import org.apache.hadoop.fs.FileSystem 
import org.apache.hadoop.fs.Path 

val hdfsConfig = new Configuration 
val hdfsURI = "hdfs://127.0.0.1:9000/hdfsData" 
val hdfs = FileSystem.get(new URI(hdfsURI), hdfsConfig) 

val oriPath = new Path("#your_localpath/customer.csv") 
val targetFile = new Path("hdfs://your_hdfspath/customer.csv") 
hdfs.copyFromLocalFile(oriPath, targetFile) 
2

Nella versione Hadoop:

Hadoop 2.4.0.2.1.1.0-390 

(E probabilmente in seguito, ho testato solo questa versione specifica in quanto è quella che ho)

È possibile copiare intere directory ricorsivamente senza alcuna notazione speciale utilizzando copyFromLocal ad esempio ,:

hadoop fs -copyFromLocal /path/on/disk /path/on/hdfs 

che funziona anche quando /path/on/disk è una directory contenente sottodirectory e file.

Problemi correlati