2012-10-08 16 views
8

Tengo un problema al intentar copiar un directorio de mi sistema local a HDFS usando el código de Java. Puedo mover archivos individuales pero no puedo encontrar una manera de mover todo un directorio con subcarpetas y archivos. Alguien me puede ayudar con eso? Gracias por adelantado.copiando el directorio del sistema local a hdfs código de Java

+0

¿Qué versión de Hadoop estás utilizando? 'bin/hadoop dfs -copyFromLocal folder' copia' folder' y recursivamente todo en él está bien para mí. –

+0

porque el directorio no es un 'archivo'. debe crear el directorio recursivamente y mover el archivo uno por uno (puede hacerlo en paralelo, si lo desea). Por supuesto, debe tener en cuenta que esta operación no es atómica, por lo que si falla, algunos archivos quedarán inacabados en hdfs. – octo

Respuesta

17

Simplemente use el método FileSystemcopyFromLocalFile. Si la ruta de origen es un directorio local que se copiará en el destino HDFS:

... 
Configuration conf = new Configuration(); 
conf.addResource(new Path("/home/user/hadoop/conf/core-site.xml")); 
conf.addResource(new Path("/home/user/hadoop/conf/hdfs-site.xml")); 

FileSystem fs = FileSystem.get(conf); 
fs.copyFromLocalFile(new Path("/home/user/directory/"), 
    new Path("/user/hadoop/dir")); 
... 
+0

la ruta para hdfs que estoy proporcionando es de la forma "hdfs: //cluster.abc.com: 8080/user/something", pero dice "FS incorrecto, archivo esperado: ///". ¿Alguna ayuda para esto? – Chirag

+1

¿Qué valor tiene en core-site.xml para fs.default.name? Debería apuntar a hdfs: // host [: port] –

+0

gracias. estableciendo fs.default.name al hdfs requerido: // host: puerto trabajado. – Chirag

0

Aquí está el código completo de trabajo para leer y escribir a HDFS. Tiene dos argumentos

  1. ruta de entrada (HDFS locales /)

  2. ruta de salida (HDFS)

Solía ​​Cloudera caja de arena.

package hdfsread; 

import java.io.BufferedInputStream; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.URI; 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.IOUtils; 

public class ReadingAFileFromHDFS { 

    public static void main(String[] args) throws IOException { 
     String uri = args[0]; 
     InputStream in = null; 
     Path pt = new Path(uri); 
     Configuration myConf = new Configuration(); 
     Path outputPath = new Path(args[1]); 

     myConf.set("fs.defaultFS","hdfs://quickstart.cloudera:8020"); 
     FileSystem fSystem = FileSystem.get(URI.create(uri),myConf); 
     OutputStream os = fSystem.create(outputPath); 
     try{ 
      InputStream is = new BufferedInputStream(new FileInputStream(uri)); 
      IOUtils.copyBytes(is, os, 4096, false); 
     } 
     catch(IOException e){ 
      e.printStackTrace(); 
     } 
     finally{ 
      IOUtils.closeStream(in); 
     } 
    } 
} 
+0

Hola cuando pruebo este, obtengo un error de org/apache/hadoop/fs/FSDataOutputStream. He agregado bibliotecas hadoop-common, hadoop-hdfs a mi pom. y también agregué core-site.xml, hdfs-site.xml a mi configuración. – user4342532

Cuestiones relacionadas