2012-10-08 3 views
8

Javaコードを使用してローカルシステムからHDFSにディレクトリをコピーしようとして問題が発生しました。個々のファイルを移動することはできますが、サブフォルダとファイルを使用してディレクトリ全体を移動する方法はわかりません。誰もそれで私を助けることができますか?前もって感謝します。ローカルシステムからhdfsにディレクトリをコピーするJavaコード

+0

どのバージョンのHadoopを使用していますか? 'bin/hadoop dfs -copyFromLocal folder'は' folder'をコピーして再帰的にすべてをコピーします。ディレクトリが 'ファイル'ではないため、 –

+0

です。再帰的にディレクトリを作成し、ファイルを1つずつ移動する必要があります(必要に応じて並行して実行できます)。もちろん、この操作はアトミックではないことに注意してください。失敗すると、いくつかのファイルがhdfsで未処理のまま残されます。 – octo

答えて

17

FileSystemcopyFromLocalFileメソッドを使用してください。ソースパスがローカルディレクトリの場合、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

私が提供しているhdfsのパスは "hdfs://cluster.abc.com:8080/user/something"という形式ですが、 "wrong FS、expected file:///"と表示されます。これのための任意の助け? – Chirag

+1

fs.default.nameのcore-site.xmlにはどのような価値がありますか? hdfs:// host [:port] –

+0

ありがとうございます。 fs.default.nameを必要なhdfs:// host:portに設定してください。 – Chirag

0

ここでは、HDFSに読み書きするための完全な作業コードを示します。それは私がClouderaのサンドボックスを使用

  • 出力パス(HDFS)

  • 入力パス(ローカル/ HDFS)の二つの引数

    1. をとります。

      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

    こんにちは、私はorg/apache/hadoop/fs/FSDataOutputStreamエラーを取得しています。 hadoop-common、hadoop-hdfsライブラリを私のpomに追加しました。私の設定にcore-site.xml、hdfs-site.xmlを追加しました。 – user4342532

    関連する問題