将目录从本地系统复制到hdfs java代码

将目录从本地系统复制到hdfs java代码,java,hadoop,hdfs,Java,Hadoop,Hdfs,我在尝试使用java代码将目录从本地系统复制到HDFS时遇到问题。我可以移动单个文件,但无法找到移动包含子文件夹和文件的整个目录的方法。有人能帮我吗?提前感谢。只需使用文件系统的方法即可。如果源路径是本地目录,它将被复制到HDFS目标: ... Configuration conf = new Configuration(); conf.addResource(new Path("/home/user/hadoop/conf/core-site.xml")); conf.addResource(

我在尝试使用java代码将目录从本地系统复制到HDFS时遇到问题。我可以移动单个文件,但无法找到移动包含子文件夹和文件的整个目录的方法。有人能帮我吗?提前感谢。

只需使用
文件系统的方法即可。如果源路径是本地目录,它将被复制到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"));
...   

下面是读写HDFS的完整工作代码。这需要两个论点

  • 输入路径(本地/HDFS)

  • 输出路径(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);
             }
         }
    }
    

    您使用的是什么版本的Hadoop
    bin/hadoop dfs-copyFromLocal folder
    copies
    folder
    ,递归地复制其中的所有内容,对我来说都很好。因为目录不是“文件”。您应该递归地创建目录并逐个移动文件(如果您愿意,可以并行地进行)。当然,您应该知道,此操作不是原子操作,因此,如果失败,一些文件将保留在hdfs上。我提供的hdfs路径的形式为“hdfs://cluster.abc.com:8080/user/something,但它表示“错误的FS,预期的文件://”。有什么帮助吗?在core-site.xml中,fs.default.name的值是多少?它应该指向hdfs://host[:波特]谢谢。将fs.default.name设置为所需的hdfs://host:port 很好。嗨,当我尝试这个时,我得到org/apache/hadoop/fs/FSDataOutputStream错误。我已经将hadoop公共、hadoop hdfs库添加到我的pom中。还将core-site.xml、hdfs-site.xml添加到我的配置中。