2012-10-08 85 views
8

我有一个问题,试图从我的本地系统复制目录到使用Java代码的HDFS。我可以移动单个文件,但无法找到移动整个目录的子文件夹和文件的方法。任何人都可以帮助我吗?提前致谢。将目录从本地系统复制到hdfs java代码

+0

您使用的是哪个版本的Hadoop? 'bin/hadoop dfs -copyFromLocal文件夹'复制'文件夹'并递归地处理它的一切,对我来说很好。 –

+0

因为目录不是'文件'。您应递归创建目录并逐个移动文件(如果您愿意,可以并行执行)。当然,你应该知道,这个操作不是原子的,所以如果你失败了,一些文件在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”,但它说“错误的FS,预期的文件:///”。任何帮助? – Chirag

+1

您在core-site.xml中为fs.default.name指定了哪个值?它应该指向hdfs:// host [:port] –

+0

谢谢。将fs.default.name设置为所需的hdfs:// host:port工作。 – Chirag

0

这是读取和写入HDFS的完整工作代码。它有两个参数

  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); 
     } 
    } 
} 
+0

嗨,当我尝试这一个我越来越org/apache/hadoop/fs/FSDataOutputStream错误。我已经将hadoop-common,hadoop-hdfs库添加到了我的pom中。并且还将core-site.xml,hdfs-site.xml添加到了我的配置中。 – user4342532

相关问题