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.xmlhdfs-site.xmlmapred-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
0 0
原创粉丝点击