10

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

4

2 に答える 2

25

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"));
...   
于 2012-10-08T21:55:35.107 に答える
0

HDFS を読み書きするための完全な作業コードを次に示します。2 つの引数を取ります

  1. 入力パス (ローカル/HDFS)

  2. 出力パス(HDFS)

Cloudera サンドボックスを使用しました。

 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);
         }
     }
}
于 2016-08-23T07:01:44.297 に答える