2012-10-08 13 views
8

Ich habe ein Problem versucht, ein Verzeichnis von meinem lokalen System zu HDFS mit Java-Code zu kopieren. Ich bin in der Lage, einzelne Dateien zu verschieben, kann aber keine Möglichkeit finden, ein ganzes Verzeichnis mit Unterordnern und Dateien zu verschieben. Kann mir jemand dabei helfen? Danke im Voraus.Kopieren des Verzeichnisses vom lokalen System zum hdfs Java-Code

+0

Welche Version von Hadoop verwenden Sie? 'bin/hadoop dfs-copyFromLocal Ordner' kopiert 'Ordner' und rekursiv alles darin für mich in Ordnung. –

+0

weil das Verzeichnis keine 'Datei' ist. Sie sollten das Verzeichnis rekursiv erstellen und die Datei einzeln verschieben (wenn Sie möchten, können Sie das auch parallel tun). Natürlich sollten Sie sich bewusst sein, dass diese Operation nicht atomar ist, wenn Sie also versagen, bleiben einige Dateien auf hdfs stehen. – octo

Antwort

17

Verwenden Sie einfach die FileSystemcopyFromLocalFile Methode. Wenn der Quellpfad ein lokales Verzeichnis ist, wird es auf das HDFS Ziel kopiert werden:

... 
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

der Pfad für hdfs, die ich zur Verfügung stelle, hat die Form "hdfs: //cluster.abc.com: 8080/user/something", aber es sagt "falsche FS, erwartete Datei: ///". Irgendwelche Hilfe dafür? – Chirag

+1

Welchen Wert haben Sie in core-site.xml für fs.default.name? Es sollte auf hdfs zeigen: // host [: port] –

+0

danke. fs.default.name auf den benötigten hdfs: // host: port eingestellt. – Chirag

0

Hier ist der vollen Arbeits Code zu lesen und in zu HDFS zu schreiben. Es braucht zwei Argumente

  1. Eingangspfad (local/HDFS)

  2. Ausgabepfad (HDFS)

I Cloudera Sandbox verwendet.

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

Hallo, wenn ich dieses versuche, erhalte ich org/apache/hadoop/fs/FSDataOutputStream Fehler. Ich habe hadoop-common, hadoop-hdfs-Bibliotheken zu meinem Pom hinzugefügt. und fügte auch core-site.xml, hdfs-site.xml zu meiner Konfiguration hinzu. – user4342532

Verwandte Themen