HDFS Java API 详解

Hadoop版本:  Hadoop 2.6.0

 连接HDFS

String URL="hdfs://hadoop001:9000";
Configuration conf = new Configuration();
conf.set("fs.defaultFS", URL);
FileSystem fs = FileSystem.get(conf);

上传文件到HDFS

//获取本地文件的输入流
FileInputStream in=new FileInputStream("d://aaa.mp3");
//获取hdfs的输出流,默认是覆盖已存在的同名文件
//上传到hdfs根目录/
FSDataOutputStream output = fs.create(new Path("/bbb.mp3"));
//通过commons中的工具类copy文件到hdfs
IOUtils.copy(in, output);

简单方法

/*
* copyFromLocalFile(Path src, Path dst)
* 该方法对上面的过程进行了封装,使操作更加简单。
*/
fs.copyFromLocalFile(new Path("d://abc.mp3"), new Path("/bcd.mp3"));

读取HDFS文件

 Path inHdfs=new Path("/bbb.mp3");
if(fs.exists(inHdfs)){
    //获取hdfs的输入流
    FSDataInputStream in = fs.open(inHdfs);
    //获取本地文件的输出流
    FileOutputStream out=new FileOutputStream("d://aaa.mp3");
    //写文件到本地磁盘
    //或使用IOUtils.copy(in, output);
    byte[] buf=new byte[1024];
    int next=0;
    while((next=in.read(buf))!=-1){
        out.write(buf, 0, next);
    }
}

简单方法

//copyToLocalFile(Path src, Path dst)
fs.copyToLocalFile(inHdfs, new Path("c://aaa.mp3"));

注意:如果要从hdfs复制文件到windows系统,需要设置useRawLocalFileSystem的值为true。否则会抛出空指针异常。

默认是使用HDFS的文件系统,如果是windows系统,需要使用原生的本地文件系统。

(???这里不是很明白,没读懂源码。)

/*
* delSrc:是否删除原文件
* Path src:源文件
* Path dst:目的文件
* useRawLocalFileSystem:是否使用原生本地文件系统
*/
fs.copyToLocalFile(false,new Path("/f1/bbb.pdf"), new Path("c://abc.pdf"),true);

删除HDFS文件

/*
*  delete(Path f, boolean recursive)
*  当删除非空目录时,recursive必须为true
*/
fs.delete(new Path("/file1), true);

创建目录

//在hdfs的根目录下创建文件夹
foofs.mkdirs(new Path("/foo"));
//文件夹的默认权限是755,也可以通过第二个参数设置权限mkdirs(Path, FsPermission)

如果文件夹的目录是相对路径,hdfs会做如下处理:

源码位置:FileSystem#fixRelativePart()

if (p.isUriPathAbsolute()) { //如果是绝对路径(/开始的路径),直接使用
      return p;
} else {//如果是相对路径,在当前用户的home目录下创建该目录
      return new Path(getWorkingDirectory(), p);
}

例如你在windows系统中执行的操作,假设当前windows的账户名是Administrator(管理员账户登陆),那么在hdfs中的home目录即:/user/Administrator

fs.mkdirs(new Path("foo"));

执行完上面的代码,就会在hdfs中创建目录结构: /user/Administrator/foo

Thanks a lot!

    END!

        

原文地址:https://www.cnblogs.com/lukeguo/p/8824772.html