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!