String URL="hdfs://hadoop001:9000"; Configuration conf = new Configuration(); conf.set("fs.defaultFS", URL); FileSystem fs = FileSystem.get(conf);
//获取本地文件的输入流 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"));
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);
/* * 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!