hadoop 开发API
来源:互联网 发布:淘宝芝士年糕哪家好吃 编辑:程序博客网 时间:2024/06/03 23:01
上文中本人是通过Hadoop的eclipse插件来管理HDFS文件系统的,在实际生产环境通常是用编程的方式来管理hadoop的文件系统
下面我们编程方式开发一个管理hadoop文件系统的应用
首先打开eclipse开发工具,新建Map/Reduce Project项目
点击Next,填写项目名称,并且配置hadoop安装目录
新建立的项目会自动导入hadoop的相关依赖jar文件,不必我们手动添加了
接下来我们调用hadoop文件系统的API来执行文件操作,我们先建立一个文件管理工具类
public class HDFSUtil { /** * 从本地复制文件到HDFS * @param srcFilePath * @param dstFilePath * @throws IOException */ public static void copyFile2HDFS(String srcFilePath,String dstFilePath){ Configuration conf = new Configuration(); Path src = new Path(srcFilePath); Path dst = new Path(dstFilePath); FileSystem hdfs=null; try { hdfs = FileSystem.get(conf); hdfs.copyFromLocalFile(src, dst); FileStatus[] files = hdfs.listStatus(dst); if(files!=null) { for(int i=0;i<files.length;i++) { System.out.println("the file is:"+files[i].getPath().getName()); } }else { System.out.println("no files"); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { hdfs.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 在HDFS上创建文件 * @param content * @param dstFile * @throws IOException */ public static void createFileInHDFS(String content,String dstFile) { Configuration conf = new Configuration(); //conf.addResource(new Path("/home/chenying/hadoop-1.2.0/conf/core-site.xml")); Path dst = new Path(dstFile); FileSystem hdfs = null; FSDataOutputStream out = null; try { hdfs=FileSystem.get(conf); out = hdfs.create(dst); // out.writeBytes(content); out.write(content.getBytes("UTF-8")); out.flush(); } catch (IOException e) { e.printStackTrace(); }finally { if(hdfs != null) { try { hdfs.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(out != null) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * 在HDFS上创建目录 * @param content * @param dstFile * @throws IOException */ public static void createDirectoryInHDFS(String dstDir) { Configuration conf = new Configuration(); Path dst = new Path(dstDir); FileSystem hdfs = null; try { hdfs=FileSystem.get(conf); hdfs.mkdirs(dst); } catch (IOException e) { e.printStackTrace(); //throw new IOException(e); }finally { if(hdfs != null) { try { hdfs.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } /** * 重命名文件 * @param originalFile * @param newFile * @throws IOException */ public static void renameFileInHDFS(String originalFile,String newFile) { Configuration conf = new Configuration(); Path originalPath = new Path(originalFile); Path newPath = new Path(newFile); FileSystem hdfs=null; try { //hdfs = newPath.getFileSystem(conf); hdfs =FileSystem.get(conf); boolean isRename=hdfs.rename(originalPath, newPath); String result=isRename?"成功":"失败"; System.out.println("文件重命名结果为:"+result); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { hdfs.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 获得文件的最后修改时间 * @param dstFile * @throws IOException */ public static void getFileLastModifyTime(String dstFile) { Configuration conf = new Configuration(); Path dstPath = new Path(dstFile); FileSystem hdfs=null; try { //hdfs = dstPath.getFileSystem(conf); hdfs =FileSystem.get(conf); FileStatus file = hdfs.getFileStatus(dstPath); long time = file.getModificationTime(); System.out.println("the last modify time is : "+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(time))); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { hdfs.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 检查文件是否存在 * @param dstFile * @throws IOException */ public static void checkFileIsExists(String dstFile) { Configuration conf = new Configuration(); Path dstPath = new Path(dstFile); FileSystem hdfs=null; try { //hdfs = dstPath.getFileSystem(conf); hdfs =FileSystem.get(conf); boolean flag = hdfs.exists(dstPath); System.out.println("is the file exists:"+flag); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { hdfs.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 获得文件的存放位置 * @param dstFile * @throws IOException */ public static void getFileLocations(String dstFile){ Configuration conf = new Configuration(); Path dstPath = new Path(dstFile); FileSystem hdfs=null; try { //hdfs = dstPath.getFileSystem(conf); hdfs =FileSystem.get(conf); FileStatus file = hdfs.getFileStatus(dstPath); BlockLocation[] blkLocations = hdfs.getFileBlockLocations(file, 0, file.getLen()); if(blkLocations != null) { int len = blkLocations.length; for(int i=0;i<len;i++) { String[] hosts = blkLocations[i].getHosts(); for(String host:hosts) { System.out.println("the location'host is : "+host); } } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { hdfs.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 删除文件 * @throws IOException */ public static void deleteFile(String dstFile){ Configuration conf = new Configuration(); Path dstPath = new Path(dstFile); FileSystem hdfs=null; try { //hdfs = dstPath.getFileSystem(conf); hdfs =FileSystem.get(conf); boolean flag = hdfs.delete(dstPath, true);////如果是目录则递归删除 System.out.println("is deleted : "+flag); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { hdfs.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}
(如果你愿意折腾,可以尝试将上面的方法改造成接口回调,本人就不做这个无谓的折腾了)
如果遇到Exception in thread "main" java.lang.IllegalArgumentException: Wrong FS: hdfs expected: file:///之类的异常,需要将${hadoop.root}/conf/目录的hadoop配置文件core-site.xml、hdfs-site.xml、mapred-site.xml拷贝到eclipse项目的bin目录里面
下面是测试类
public class HdfsClient { /** * 上传文件 * @throws IOException */ @Test public void testCopyFile2HDFS() throws IOException { String srcFilePath = "/home/chenying/FetchTask.java"; String dstFilePath = "hdfs://localhost:9000/user/coder/in"; HDFSUtil.copyFile2HDFS(srcFilePath, dstFilePath); } /** * 创建文件 */ @Test public void testCreateFileInHDFS() { String content = "hey,Hadoop. 测试中文"; String dstFile = "hdfs://localhost:9000/user/coder/input/hey"; HDFSUtil.createFileInHDFS(content, dstFile); } /** * 重命名文件 */ @Test public void testRenameFileInHDFS() { String originalFile = "hdfs://localhost:9000/user/coder/input/hey"; String newFile = "hdfs://localhost:9000/user/coder/input/hey_hadoop"; HDFSUtil.renameFileInHDFS(originalFile, newFile); } /** * 获取文件的最后修改时间 */ @Test public void testGetFileLastModifyTimme() { String dstFile = "hdfs://localhost:9000/user/coder/input/hey_hadoop"; HDFSUtil.getFileLastModifyTime(dstFile); } /** * 检查文件是否存在 */ @Test public void testCheckFileIsExists() { String dstFile = "hdfs://localhost:9000/user/coder/input/hey_hadoop"; HDFSUtil.checkFileIsExists(dstFile); } /** * 获取文件的存放位置 */ @Test public void testGetFileLocations() { String dstFile = "hdfs://localhost:9000/user/coder/input/hey_hadoop"; HDFSUtil.getFileLocations(dstFile); } /** * 删除文件 */ @Test public void testDeleteFile(){ String dstFile = "hdfs://localhost:9000/user/coder/output"; HDFSUtil.deleteFile(dstFile); }}
运行该测试类,正常情况下,上面的测试用例会显示绿色
后面部分,本人打算采用HDFS开发一个图片服务器
---------------------------------------------------------------------------
本系列Hadoop1.2.0开发笔记系本人原创
转载请注明出处 博客园 刺猬的温驯
本文链接 http://www.cnblogs.com/chenying99/archive/2013/06/02/3113449.html
- hadoop 开发API
- hadoop新api开发
- Hadoop 文件系统API开发编译
- eclipse开发hadoop hdfs api 运行错误
- Hadoop开发常用的API汇总
- hadoop API
- hadoop API
- Hadoop API
- 基于ECLIPSE的HADOOP开发-----HDFS API学习
- 基于eclipse的hadoop开发-----HDFS API学习
- hadoop 0.13 api 翻译
- Hadoop API 使用介绍
- Hadoop API 使用介绍
- Hadoop API 使用介绍
- hadoop的新旧api
- hadoop -webhdfs api 方法
- Hadoop API 使用介绍
- hadoop hdfs API操作
- Apache OFBIZ快速上手(三)--目录&&配置文件介绍
- 求两个值的最大公约数
- 关于asp.net前台js调用后台方法的问题
- sysbench 0.5 性能测试工具
- Valid Sudoku
- hadoop 开发API
- 深入Java集合学习系列:HashMap的实现原理
- hdu 3790 最短路径问题
- Android流式布局FlowLayout的实现,Android布局的内部机制onMeasure、onLayout
- OpenCV中parallel_for 和 parallel_for_学习笔记
- tpcc-mysql 性能测试
- android tween 动画效果
- 最小路径覆盖问题
- Android尺寸标注设计大全和Android切图规范