2012-10-08 6 views
8

Mam problem podczas próby skopiowania katalogu z mojego systemu lokalnego do HDFS przy użyciu kodu Java. Jestem w stanie przenosić pojedyncze pliki, ale nie mogę znaleźć sposobu na przeniesienie całego katalogu z podfolderami i plikami. Czy ktoś może mi w tym pomóc? Z góry dziękuję.kopiowanie katalogu z systemu lokalnego do kodu Javy hdfs

+0

Jakiej wersji Hadoop używasz? 'bin/hadoop dfs -copyFromLocal folder' kopiuje' folder' i rekursywnie wszystko w nim jest dla mnie w porządku. –

+0

, ponieważ katalog nie jest "plikiem". powinieneś utworzyć rekursywnie katalog i przenieść plik jeden po drugim (możesz zrobić to równolegle, jeśli chcesz). Oczywiście powinieneś zdawać sobie sprawę, że ta operacja nie jest atomowa, więc jeśli ci się nie uda, niektóre pliki pozostały niedokończone w hdfs. – octo

Odpowiedz

17

Po prostu użyj metody FileSystem 'copyFromLocalFile. Jeśli ścieżka źródłem jest lokalny katalog zostanie skopiowany do miejsca przeznaczenia 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

Ścieżka do pliku hdf, który udostępniam, ma postać "hdfs: //cluster.abc.com: 8080/user/something", ale jest napisane "zły FS, oczekiwany plik: ///". Jakakolwiek pomoc w tym? – Chirag

+1

Jaką wartość masz w core-site.xml dla fs.default.name? Powinien wskazywać na hdfs: // host [: port] –

+0

dzięki. ustawienie fs.default.name na wymagany hdfs: // host: port działał. – Chirag

0

Oto pełny kod roboczych czytać i pisać do HDFS. To trwa dwa argumenty

  1. ścieżki wejścia (local/HDFS)

  2. ścieżka wyjściowa (HDFS)

użyłem Cloudera piaskownicy.

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

Witam, gdy próbuję tego, otrzymuję błąd org/apache/hadoop/fs/FSDataOutputStream. Dodałem do mojego pomu wspólne biblioteki hadoop-common, hadoop-hdfs. a także dodałem plik core-site.xml, hdfs-site.xml do mojej konfiguracji. – user4342532