zoukankan      html  css  js  c++  java
  • Hadoop基础-HDFS的API常见操作

                        Hadoop基础-HDFS的API常见操作

                                                      作者:尹正杰

    版权声明:原创作品,谢绝转载!否则将追究法律责任。

      本文主要是记录一写我在学习HDFS时的一些琐碎的学习笔记, 方便自己以后查看。在调用API的时候,可能会需要maven依赖,添加依赖的包如下:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <project xmlns="http://maven.apache.org/POM/4.0.0"
     3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     5     <parent>
     6         <artifactId>HADOOP</artifactId>
     7         <groupId>yinzhengjie.org.cn</groupId>
     8         <version>1.0-SNAPSHOT</version>
     9     </parent>
    10     <modelVersion>4.0.0</modelVersion>
    11 
    12     <artifactId>HDFS</artifactId>
    13 
    14 
    15 
    16     <dependencies>
    17         <dependency>
    18             <groupId>org.apache.hadoop</groupId>
    19             <artifactId>hadoop-common</artifactId>
    20             <version>2.6.0</version>
    21         </dependency>
    22 
    23         <dependency>
    24             <groupId>org.apache.hadoop</groupId>
    25             <artifactId>hadoop-client</artifactId>
    26             <version>2.6.0</version>
    27         </dependency>
    28 
    29         <dependency>
    30             <groupId>junit</groupId>
    31             <artifactId>junit</artifactId>
    32             <version>4.11</version>
    33             <scope>test</scope>
    34         </dependency>
    35 
    36     </dependencies>
    37 
    38 </project>

    一.HDFS获取文件系统

    /*
    @author :yinzhengjie
    Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E7%94%9F%E6%80%81%E5%9C%88/
    EMAIL:y1053419035@qq.com
    */
    package hdfs.yinzhengjie.org.cn;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    
    import java.io.IOException;
    
    public class HdfsClient {
    
        public static void main(String[] args) throws IOException {
            initHDFS();
        }
    
        //获取文件系统
        public static  void initHDFS() throws IOException{
            //创建Configuration对象
            Configuration conf = new Configuration();
    //获取文件系统
            FileSystem fs = FileSystem.get(conf);
    
            //打印文件系统到控制台
            System.out.println(fs);
        }
    }

    二.HDFS文件上传

    /*
    @author :yinzhengjie
    Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E7%94%9F%E6%80%81%E5%9C%88/
    EMAIL:y1053419035@qq.com
    */
    package hdfs.yinzhengjie.org.cn;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    
    import java.net.URI;
    
    public class HdfsClient {
    
        public static void main(String[] args) throws Exception {
            putFileToHDFSinitHDFS();
        }
        //文件上传
        public static  void putFileToHDFSinitHDFS() throws Exception {
            //配合Hadoop的环境变量,如果没有配置可能会抛异常:“ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path”,还有一件事就是你的HADOOP_HOME的bin目录下必须得有winutils.exe
            System.setProperty("hadoop.home.dir", "D:\yinzhengjie\softwares\hadoop-2.7.3");
            //创建Configuration对象
            Configuration conf = new Configuration();
            //在代码中配置副本数,优先级最高,其次是配置文件的优先级,最后才是hdfs集群默认的副本数
            conf.set("dfs.replication","2");
            //获取文件系统,注意传入的三个参数对应的是hdfs的链接地址(需要将集群的客户端配置文件放在RESOURCES目录下!),配置对象,以及提交权限的用户名称。
            FileSystem fs = FileSystem.get(new URI("hdfs://yinzhengjie-hdfs-ha"),conf,"hdfs");
            /**
             * 当然,传入hdfs的url也可以指定主机名,当然你得在操作系统的hosts文件中指定对应的IP地址信息!
             *    FileSystem fs = FileSystem.get(new URI("hdfs://node105.yinzhengjie.org.cn:8020"),conf,"hdfs");
             */
            //上传文件到hdfs路径中
            fs.copyFromLocalFile(new Path("D:\yinzhengjie\data\yinzhengjie.txt"),new Path("/yinzhengjie/yinzhengjie.blog"));
        }
    }

    三.HDFS文件下载

    /*
    @author :yinzhengjie
    Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E7%94%9F%E6%80%81%E5%9C%88/
    EMAIL:y1053419035@qq.com
    */
    package hdfs.yinzhengjie.org.cn;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    
    import java.net.URI;
    
    public class HdfsClient {
    
        public static void main(String[] args) throws Exception {
            getFileFromHDFS();
        }
        //下载文件
        public static void getFileFromHDFS() throws Exception {
            //配合Hadoop的环境变量,如果没有配置可能会抛异常:“ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path”,还有一件事就是你的HADOOP_HOME的bin目录下必须得有winutils.exe
            System.setProperty("hadoop.home.dir", "D:\yinzhengjie\softwares\hadoop-2.7.3");
            //创建Configuration对象
            Configuration conf = new Configuration();
            //获取文件系统,需要传入hdfs的链接地址,conf对象,以及操作的用户名
            FileSystem fs = FileSystem.get(new URI("hdfs://node105.yinzhengjie.org.cn:8020"),conf,"hdfs");
            /**
             * 指定下载操作,下面是对该copyToLocalFile的参数说明
             *      第一个参数:boolean delSrc    -------> 指是否将源文件删除
             *      第二个参数:Path src     -------> 指定下载的文件路径
             *      第三个参数:Path dst     -------> 指定文件下载到的路径
             *      第四个参数: boolean useRawLocalFileSystem -------> 指是否开启文件校验
             */
            fs.copyToLocalFile(false,new Path("/yinzhengjie/yinzhengjie.blog"),new Path("D:\yinzhengjie\data"),true);
            //关闭链接,释放资源
            fs.close();
        }
    
    }

    四.HDFS目录创建

    /*
    @author :yinzhengjie
    Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E7%94%9F%E6%80%81%E5%9C%88/
    EMAIL:y1053419035@qq.com
    */
    package hdfs.yinzhengjie.org.cn;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    
    import java.net.URI;
    
    public class HdfsClient {
    
        public static void main(String[] args) throws Exception {
            mkdirAtHDFS();
        }
    
        //在hdfs中创建文件夹
        public static void mkdirAtHDFS() throws Exception{
            //配合Hadoop的环境变量,如果没有配置可能会抛异常:“ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path”,还有一件事就是你的HADOOP_HOME的bin目录下必须得有winutils.exe
             System.setProperty("hadoop.home.dir", "D:\yinzhengjie\softwares\hadoop-2.7.3");
             //创建Configuration对象
             Configuration conf = new Configuration();
             //获取文件系统,需要传入hdfs的链接地址,conf对象,以及操作的用户名
             FileSystem fs = FileSystem.get(new URI("hdfs://node105.yinzhengjie.org.cn:8020"),conf,"hdfs");
             //创建目录
            fs.mkdirs(new Path("/yinzhengjie/2018/11/04"));
            //释放资源
            fs.close();
        }
    
    }

    五.HDFS文件夹删除

    /*
    @author :yinzhengjie
    Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E7%94%9F%E6%80%81%E5%9C%88/
    EMAIL:y1053419035@qq.com
    */
    package hdfs.yinzhengjie.org.cn;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    
    import java.net.URI;
    
    public class HdfsClient {
    
        public static void main(String[] args) throws Exception {
            deleteAtHDFS();
        }
    
        //删除文件或者文件夹
        public static void deleteAtHDFS() throws Exception{
            //配合Hadoop的环境变量,如果没有配置可能会抛异常:“ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path”,还有一件事就是你的HADOOP_HOME的bin目录下必须得有winutils.exe
            System.setProperty("hadoop.home.dir", "D:\yinzhengjie\softwares\hadoop-2.7.3");
            //创建Configuration对象
            Configuration conf = new Configuration();
            //获取文件系统,需要传入hdfs的链接地址,conf对象,以及操作的用户名
             FileSystem fs = FileSystem.get(new URI("hdfs://node105.yinzhengjie.org.cn:8020"),conf,"hdfs");
    
            //执行删除操作,第一个参数指定的是删除路径,第二个参数表示是否递归删除。要注意的是,如果是目录的必须设置为true,否则会抛异常!
            fs.delete(new Path("/yinzhengjie/2018"),true);
    
            //关闭资源
            fs.close();
        }
    }

    六.HDFS文件名更改

    /*
    @author :yinzhengjie
    Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E7%94%9F%E6%80%81%E5%9C%88/
    EMAIL:y1053419035@qq.com
    */
    package hdfs.yinzhengjie.org.cn;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    
    import java.net.URI;
    
    public class HdfsClient {
    
        public static void main(String[] args) throws Exception {
            renameAtHDFS();
        }
        //给文件或者目录进行重命名操作
        public static void renameAtHDFS() throws Exception{
            //配合Hadoop的环境变量,如果没有配置可能会抛异常:“ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path”,还有一件事就是你的HADOOP_HOME的bin目录下必须得有winutils.exe
            System.setProperty("hadoop.home.dir", "D:\yinzhengjie\softwares\hadoop-2.7.3");
            //创建Configuration对象
            Configuration conf = new Configuration();
            //获取文件系统,需要传入hdfs的链接地址,conf对象,以及操作的用户名
             FileSystem fs = FileSystem.get(new URI("hdfs://node105.yinzhengjie.org.cn:8020"),conf,"hdfs");
            //修改文件名称
            fs.rename(new Path("/yinzhengjie/yinzhengjie.blog2"),new Path("/yinzhengjie/yinzhengjie.blog-2018-11-04"));
            //关闭资源
            fs.close();
        }
    }

    七.HDFS文件详情查看

    /*
    @author :yinzhengjie
    Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E7%94%9F%E6%80%81%E5%9C%88/
    EMAIL:y1053419035@qq.com
    */
    package hdfs.yinzhengjie.org.cn;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.*;
    
    import java.net.URI;
    
    public class HdfsClient {
    
        public static void main(String[] args) throws Exception {
            readListFiles();
        }
    
        public static void readListFiles() throws Exception {
            //配合Hadoop的环境变量,如果没有配置可能会抛异常:“ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path”,还有一件事就是你的HADOOP_HOME的bin目录下必须得有winutils.exe
           System.setProperty("hadoop.home.dir", "D:\yinzhengjie\softwares\hadoop-2.7.3");
           //创建配置信息对象
           Configuration conf = new Configuration();
             //获取文件系统,需要传入hdfs的链接地址,conf对象,以及操作的用户名
            FileSystem fs = FileSystem.get(new URI("hdfs://node105.yinzhengjie.org.cn:8020"),conf,"hdfs");
    
            //获取文件详情(注意:返回的是迭代器,而不是List之类的容器。),第一个参数指定的想要在hdfs获取的路径,第二个参数是否递归获取,改参数一般针对目录有效!
            RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
    
    
            while (listFiles.hasNext()) {
                //调用迭代器listFiles的next()方法获取文件详细信息
                LocatedFileStatus fileStatus = listFiles.next();
                //输出文件名称
                System.out.println(fileStatus.getPath().getName());
                //输出块大小的信息
                System.out.println(fileStatus.getBlockSize());
                //输出权限信息
                System.out.println(fileStatus.getPermission());
                //输出长度信息
                System.out.println(fileStatus.getLen());
                //输出组的信息
                System.out.println(fileStatus.getGroup());
    
                //获取到块的位置信息
                BlockLocation[] blockLocations = fileStatus.getBlockLocations();
    
                for (BlockLocation bl : blockLocations) {
    
                    System.out.println("block-offset:" + bl.getOffset());
                    //获取该快在哪个节点上
                    String[] hosts = bl.getHosts();
    
                    for (String host : hosts) {
                        //打印获取到的主机信息
                        System.out.println(host);
                    }
                }
    
                System.out.println("<--------------尹正杰的分割线------------->");
            }
        }
    }
    
    8>.HDFS文件和文件夹
    /*
    @author :yinzhengjie
    Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E7%94%9F%E6%80%81%E5%9C%88/
    EMAIL:y1053419035@qq.com
    */
    package hdfs.yinzhengjie.org.cn;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.*;
    
    import java.net.URI;
    
    public class HdfsClient {
    
        public static void main(String[] args) throws Exception {
            findAtFiles();
        }
    
        public static void findAtFiles() throws Exception {
            //配合Hadoop的环境变量,如果没有配置可能会抛异常:“ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path”,还有一件事就是你的HADOOP_HOME的bin目录下必须得有winutils.exe
           System.setProperty("hadoop.home.dir", "D:\yinzhengjie\softwares\hadoop-2.7.3");
           //创建配置信息对象
           Configuration conf = new Configuration();
             //获取文件系统,需要传入hdfs的链接地址,conf对象,以及操作的用户名
            FileSystem fs = FileSystem.get(new URI("hdfs://node105.yinzhengjie.org.cn:8020"),conf,"hdfs");
    
            //获取查询路径下的文件状态信息
            FileStatus[] listStatus = fs.listStatus(new Path("/"));
    
            //便利所有的文件状态
            for (FileStatus status : listStatus) {
                //判断是文件还是文件夹
                if (status.isFile()){
                    //如果是文件就在打印的时候加上指定的字符串前添加"file ------->"
                    System.out.println("file ------->" + status.getPath().getName());
                }else {
                    //如果是文件夹就在打印的时候加上特定的字符串前添加"directories ------->"
                    System.out.println("directories ------->"+ status.getPath().getName());
                }
            }
        }
    }
  • 相关阅读:
    Excel多工作表快速汇总,简单才是硬道理
    Excel中的条件汇总函数,看过这些你就懂
    SUMPRODUCT函数详解
    关于iOS中的文本操作-管理text fields 和 text views
    ios开发之多线程资源争夺
    关于ios中的文本操作-简介
    ios开发小技巧之提示音播放与震动
    ios开发小技巧之摇一摇截屏
    ios开发之网络数据的下载与上传
    ios开发之网络访问的数据类型
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/9906192.html
Copyright © 2011-2022 走看看