【问题标题】:copying directory from local system to hdfs java code将目录从本地系统复制到 hdfs java 代码
【发布时间】:2012-10-08 14:38:39
【问题描述】:

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

【问题讨论】:

  • 您使用的是哪个版本的 Hadoop? bin/hadoop dfs -copyFromLocal folder 复制 folder 并递归其中的所有内容对我来说都很好。
  • 因为目录不是“文件”。您应该递归地创建目录并一个一个地移动文件(如果您愿意,您可以并行执行)。当然,你应该知道,这个操作不是原子的,所以如果你失败了,一些文件在 hdfs 上没有完成。

标签: java hadoop hdfs


【解决方案1】:

只需使用FileSystem 的copyFromLocalFile 方法。如果源路径是本地目录,它将被复制到 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://cluster.abc.com:8080/user/something”,但它显示“错误的 FS,预期的文件:// /”。有什么帮助吗?
  • 您在 core-site.xml 中为 fs.default.name 提供了哪个值?它应该指向 hdfs://host[:port]
  • 谢谢。将 fs.default.name 设置为所需的 hdfs://host:port 工作。
【解决方案2】:

这是读取和写入 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);
         }
     }
}

【讨论】:

  • 嗨,当我尝试这个时,我收到 org/apache/hadoop/fs/FSDataOutputStream 错误。我在我的 pom.xml 中添加了 hadoop-common、hadoop-hdfs 库。并将 core-site.xml、hdfs-site.xml 添加到我的配置中。
猜你喜欢
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
  • 2015-03-28
  • 1970-01-01
相关资源
最近更新 更多