您现在的位置是:首页 > 文章详情

hadoop: hdfs API示例

日期:2015-05-19点击:486

利用hdfs的api,可以实现向hdfs的文件、目录读写,利用这一套API可以设计一个简易的山寨版云盘,见下图:

点击查看大图

为了方便操作,将常用的文件读写操作封装了一个工具类:

 1 import org.apache.hadoop.conf.Configuration;  2 import org.apache.hadoop.fs.*;  3 import org.apache.hadoop.io.IOUtils;  4  5 import java.io.ByteArrayOutputStream;  6 import java.io.IOException;  7 import java.io.InputStream;  8 import java.io.OutputStream;  9  10 /**  11  * HDFS工具类  12  * Author: 菩提树下的杨过(http://yjmyzz.cnblogs.com)  13  * Since: 2015-05-21  14 */  15 public class HDFSUtil {  16  17  18 private HDFSUtil() {  19  20  }  21  22 /**  23  * 判断路径是否存在  24  *  25  * @param conf  26  * @param path  27  * @return  28  * @throws IOException  29 */  30 public static boolean exits(Configuration conf, String path) throws IOException {  31 FileSystem fs = FileSystem.get(conf);  32 return fs.exists(new Path(path));  33  }  34  35 /**  36  * 创建文件  37  *  38  * @param conf  39  * @param filePath  40  * @param contents  41  * @throws IOException  42 */  43 public static void createFile(Configuration conf, String filePath, byte[] contents) throws IOException {  44 FileSystem fs = FileSystem.get(conf);  45 Path path = new Path(filePath);  46 FSDataOutputStream outputStream = fs.create(path);  47  outputStream.write(contents);  48  outputStream.close();  49  fs.close();  50  }  51  52 /**  53  * 创建文件  54  *  55  * @param conf  56  * @param filePath  57  * @param fileContent  58  * @throws IOException  59 */  60 public static void createFile(Configuration conf, String filePath, String fileContent) throws IOException {  61  createFile(conf, filePath, fileContent.getBytes());  62  }  63  64 /**  65  * @param conf  66  * @param localFilePath  67  * @param remoteFilePath  68  * @throws IOException  69 */  70 public static void copyFromLocalFile(Configuration conf, String localFilePath, String remoteFilePath) throws IOException {  71 FileSystem fs = FileSystem.get(conf);  72 Path localPath = new Path(localFilePath);  73 Path remotePath = new Path(remoteFilePath);  74 fs.copyFromLocalFile(true, true, localPath, remotePath);  75  fs.close();  76  }  77  78 /**  79  * 删除目录或文件  80  *  81  * @param conf  82  * @param remoteFilePath  83  * @param recursive  84  * @return  85  * @throws IOException  86 */  87 public static boolean deleteFile(Configuration conf, String remoteFilePath, boolean recursive) throws IOException {  88 FileSystem fs = FileSystem.get(conf);  89 boolean result = fs.delete(new Path(remoteFilePath), recursive);  90  fs.close();  91 return result;  92  }  93  94 /**  95  * 删除目录或文件(如果有子目录,则级联删除)  96  *  97  * @param conf  98  * @param remoteFilePath  99  * @return 100  * @throws IOException 101 */ 102 public static boolean deleteFile(Configuration conf, String remoteFilePath) throws IOException { 103 return deleteFile(conf, remoteFilePath, true); 104  } 105 106 /** 107  * 文件重命名 108  * 109  * @param conf 110  * @param oldFileName 111  * @param newFileName 112  * @return 113  * @throws IOException 114 */ 115 public static boolean renameFile(Configuration conf, String oldFileName, String newFileName) throws IOException { 116 FileSystem fs = FileSystem.get(conf); 117 Path oldPath = new Path(oldFileName); 118 Path newPath = new Path(newFileName); 119 boolean result = fs.rename(oldPath, newPath); 120  fs.close(); 121 return result; 122  } 123 124 /** 125  * 创建目录 126  * 127  * @param conf 128  * @param dirName 129  * @return 130  * @throws IOException 131 */ 132 public static boolean createDirectory(Configuration conf, String dirName) throws IOException { 133 FileSystem fs = FileSystem.get(conf); 134 Path dir = new Path(dirName); 135 boolean result = fs.mkdirs(dir); 136  fs.close(); 137 return result; 138  } 139 140 /** 141  * 列出指定路径下的所有文件(不包含目录) 142  * 143  * @param conf 144  * @param basePath 145  * @param recursive 146 */ 147 public static RemoteIterator<LocatedFileStatus> listFiles(FileSystem fs, String basePath, boolean recursive) throws IOException { 148 149 RemoteIterator<LocatedFileStatus> fileStatusRemoteIterator = fs.listFiles(new Path(basePath), recursive); 150 151 return fileStatusRemoteIterator; 152  } 153 154 /** 155  * 列出指定路径下的文件(非递归) 156  * 157  * @param conf 158  * @param basePath 159  * @return 160  * @throws IOException 161 */ 162 public static RemoteIterator<LocatedFileStatus> listFiles(Configuration conf, String basePath) throws IOException { 163 FileSystem fs = FileSystem.get(conf); 164 RemoteIterator<LocatedFileStatus> remoteIterator = fs.listFiles(new Path(basePath), false); 165  fs.close(); 166 return remoteIterator; 167  } 168 169 /** 170  * 列出指定目录下的文件\子目录信息(非递归) 171  * 172  * @param conf 173  * @param dirPath 174  * @return 175  * @throws IOException 176 */ 177 public static FileStatus[] listStatus(Configuration conf, String dirPath) throws IOException { 178 FileSystem fs = FileSystem.get(conf); 179 FileStatus[] fileStatuses = fs.listStatus(new Path(dirPath)); 180  fs.close(); 181 return fileStatuses; 182  } 183 184 185 /** 186  * 读取文件内容 187  * 188  * @param conf 189  * @param filePath 190  * @return 191  * @throws IOException 192 */ 193 public static String readFile(Configuration conf, String filePath) throws IOException { 194 String fileContent = null; 195 FileSystem fs = FileSystem.get(conf); 196 Path path = new Path(filePath); 197 InputStream inputStream = null; 198 ByteArrayOutputStream outputStream = null; 199 try { 200 inputStream = fs.open(path); 201 outputStream = new ByteArrayOutputStream(inputStream.available()); 202  IOUtils.copyBytes(inputStream, outputStream, conf); 203 fileContent = outputStream.toString(); 204 } finally { 205  IOUtils.closeStream(inputStream); 206  IOUtils.closeStream(outputStream); 207  fs.close(); 208  } 209 return fileContent; 210  } 211 }
View Code

简单的测试了一下:

 1  @Test  2 public void test() throws IOException {  3 Configuration conf = new Configuration();  4 String newDir = "/test";  5 //01.检测路径是否存在 测试  6 if (HDFSUtil.exits(conf, newDir)) {  7 System.out.println(newDir + " 已存在!");  8 } else {  9 //02.创建目录测试 10 boolean result = HDFSUtil.createDirectory(conf, newDir); 11 if (result) { 12 System.out.println(newDir + " 创建成功!"); 13 } else { 14 System.out.println(newDir + " 创建失败!"); 15  } 16  } 17 String fileContent = "Hi,hadoop. I love you"; 18 String newFileName = newDir + "/myfile.txt"; 19 20 //03.创建文件测试 21  HDFSUtil.createFile(conf, newFileName, fileContent); 22 System.out.println(newFileName + " 创建成功"); 23 24 //04.读取文件内容 测试 25 System.out.println(newFileName + " 的内容为:\n" + HDFSUtil.readFile(conf, newFileName)); 26 27 //05. 测试获取所有目录信息 28 FileStatus[] dirs = HDFSUtil.listStatus(conf, "/"); 29 System.out.println("--根目录下的所有子目录---"); 30 for (FileStatus s : dirs) { 31  System.out.println(s); 32  } 33 34 //06. 测试获取所有文件 35 FileSystem fs = FileSystem.get(conf); 36 RemoteIterator<LocatedFileStatus> files = HDFSUtil.listFiles(fs, "/", true); 37 System.out.println("--根目录下的所有文件---"); 38 while (files.hasNext()) { 39  System.out.println(files.next()); 40  } 41  fs.close(); 42 43 //删除文件测试 44 boolean isDeleted = HDFSUtil.deleteFile(conf, newDir); 45 System.out.println(newDir + " 已被删除"); 46 47 }
View Code

注:测试时,不要忘记了在resources目录下放置core-site.xml文件,不然IDE环境下,代码不知道去连哪里的HDFS

输出结果:

/test 已存在!
/test/myfile.txt 创建成功
/test/myfile.txt 的内容为:
Hi,hadoop. I love you
--根目录下的所有子目录---
FileStatus{path=hdfs://172.28.20.102:9000/jimmy; isDirectory=true; modification_time=1432176691550; access_time=0; owner=hadoop; group=supergroup; permission=rwxrwxrwx; isSymlink=false}
FileStatus{path=hdfs://172.28.20.102:9000/test; isDirectory=true; modification_time=1432181331362; access_time=0; owner=jimmy; group=supergroup; permission=rwxr-xr-x; isSymlink=false}
FileStatus{path=hdfs://172.28.20.102:9000/user; isDirectory=true; modification_time=1431931797244; access_time=0; owner=hadoop; group=supergroup; permission=rwxr-xr-x; isSymlink=false}
--根目录下的所有文件---
LocatedFileStatus{path=hdfs://172.28.20.102:9000/jimmy/input/README.txt; isDirectory=false; length=1366; replication=1; blocksize=134217728; modification_time=1431922483851; access_time=1432174134018; owner=hadoop; group=supergroup; permission=rw-r--r--; isSymlink=false}
LocatedFileStatus{path=hdfs://172.28.20.102:9000/jimmy/output/_SUCCESS; isDirectory=false; length=0; replication=3; blocksize=134217728; modification_time=1432176692454; access_time=1432176692448; owner=jimmy; group=supergroup; permission=rw-r--r--; isSymlink=false}
LocatedFileStatus{path=hdfs://172.28.20.102:9000/jimmy/output/part-r-00000; isDirectory=false; length=1306; replication=3; blocksize=134217728; modification_time=1432176692338; access_time=1432176692182; owner=jimmy; group=supergroup; permission=rw-r--r--; isSymlink=false}
LocatedFileStatus{path=hdfs://172.28.20.102:9000/test/myfile.txt; isDirectory=false; length=21; replication=3; blocksize=134217728; modification_time=1432181331601; access_time=1432181331362; owner=jimmy; group=supergroup; permission=rw-r--r--; isSymlink=false}
/test 已被删除

用spring-mvc结合hdfs api仿造hadoop的文件浏览管理界面,做了一个山寨版:(只完成了文件列表功能)

点击查看大图

源代码托管在taobao开源平台上了,有需要的可以参考下:

http://code.taobao.org/p/hdfs-web-client/src/trunk/

原文链接:https://yq.aliyun.com/articles/250808
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章