2011-01-17 20 views
19

¿Hay una API HDFS que pueda copiar un directorio local completo al HDFS? Encontré una API para copiar archivos pero ¿hay alguna para directorios?Hadoop Copiar un directorio?

Respuesta

15

Utilice Hadoop FS shell. Específicamente:

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

Si desea hacerlo mediante programación, crear dos sistemas de archivos (uno local y uno HDFS) y utilizar the FileUtil class

+0

necesito hacer esto programáticamente. no desde el shell – rakeshr

+0

ok, he agregado cómo hacerlo usando FileUtil. –

+0

¿Puede hadoop fs soportar copia de un archivo compartido? Nunca logro hacer eso – machinarium

10

He intentado copiar desde el directorio utilizando

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

Dio me error diciendo que Target es un directorio. Luego lo modifiqué a

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

funciona.

+1

Esto es con referencia a la versión 0.20 de hadoop. – LGG

+2

este problema ha sido reparado y esta notación ya no es necesaria. Sin embargo, el OP no especificó una versión de hadoop, por lo que esta respuesta aún puede aplicarse a las versiones anteriores. – Tommy

0

Para el programador, también puede usar copyFromLocalFile. He aquí un ejemplo:

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

En la versión de Hadoop:

Hadoop 2.4.0.2.1.1.0-390 

(Y probablemente más adelante; sólo he probado esta versión específica, ya que es el que tengo)

Puede copiar directorios enteros de forma recursiva sin ninguna anotación especial utilizando copyFromLocal por ejemplo ,:

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

que funciona incluso cuando /path/on/disk es un directorio que contiene subdirectorios y archivos.

Cuestiones relacionadas