zoukankan      html  css  js  c++  java
  • 构建HDFS访问客户端对象

    HDFS在生产生活中应用主要是客户端的开发,其核心步骤是从HDFS提供的API构建一个HDFS的访问客户端对象,通过该对象对HDFS上的文件进行增删改查

    1.配置JAVA环境

    首先电脑里cmd输入java -version  查看版本,如果没有出现下面图片这样的现象,那么说明你没有JAVA环境,可以去网上找资料配置JAVA环境(环境好久之前配置的了,没记录,就自己找一下吧)

    2.下载安装包

       下载eclipse 并安装            eclipse安装包      password:mua5   (workplace自己记住就行)

       下载maven包                     maven   password:5ylo

    3.配置eclipse 

    Window  ----->    Preferences    ------>  Java     ------>   Installed JREs   ---->   Add(将我们能的JDK找到放进去) 

    同时把Java   --->   Comlier中的JDK    的版本改成自己的 (我的是1.8的)

     

    修改maven,这个里面ADD的就是上面下载的那个,选在apache-maven-3.3.9就行

    修改Maven中的 User Settings 修改Settings 路径是apache-maven-3.3.9/conf/settings.xml   (记得修改settings.xml中的一个路径,因为你存的地方肯定和我不一样!)

     

     4.新建工程

    1.建立一个Maven Project   下面就是创建简单工程,取名啥的

    2.引入依赖  在pom.xml下我们加入依赖关系 

     输入:

    <dependencies>
          <dependency>
              <groupId>org.apache.hadoop</groupId>
              <artifactId>hadoop-common</artifactId>
              <version>2.7.4</version>
          </dependency>
          <dependency>
              <groupId>org.apache.hadoop</groupId>
              <artifactId>hadoop-hdfs</artifactId>
              <version>2.7.4</version>
          </dependency>
          <dependency>
              <groupId>org.apache.hadoop</groupId>
              <artifactId>hadoop-client</artifactId>
              <version>2.7.4</version>
          </dependency>
          <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
              <version>RELEASE</version>
          </dependency>
      </dependencies>

     3.保存之后更新配置 

    之后会产生一个包

     在src/main/java下建立包,包下建立一个类

     引入参数(出现红线,就按下ctrl+shift+o键进行填包,记得选在带hadoop的)
    输入  :public class HDFS_CRUD {
        
        FileSystem fs = null;
        
        @Before // 此注解可以保证init方法在程序中最先执行
        public void init() throws Exception{
            // 构造一个配置参数对象,设置一个参数:要访问的hdfs的uri
            Configuration conf = new Configuration();
            // 这里指定使用的是hdfs
            conf.set("fs.defaultFS", "hdfs://hadoop01:9000");// 此处使用主机名需要配置windows的host文件
            // 通过如下的方式进行客户端身份的设置
            System.setProperty("HADOOP_USER_NAME", "root");
            // 通过FileSystem的静态方法获取文件系统客户端对象
            fs = FileSystem.get(conf);
        }

     从客户端中上传文件(这里注意斜杠方向)

    输入;

    @Test
        public void testAddFileToHdfs() throws IOException {
            
            // 要上传的文件所在的路径
            Path src = new Path("D:\test.txt");
            // 要上传到hdfs的目标路径
            Path dst = new Path("/testFile"); // 一定注意此处的testFile就是上传到hdfs的文件的名字而不是文件夹
            // 上传
            fs.copyFromLocalFile(src, dst);
            //关闭资源
            fs.close();
        }

    从服务器下载文件(是不是感觉指令有那么一丝属性)

    输入:// 从hdfs 中复制文件到本地文件系统
        @Test
        public void testDownloadFileToLocal() throws IOException {
            // 下载文件
            Path src = new Path("/long");
            Path dst = new Path("D:/");
            fs.copyToLocalFile(false,src, dst,true);
            
            // 关闭资源
            fs.close();
        }

     

     查看;删除;重命名文件

    输入:
        @Test
        public void testMkdirAndDeleteAndRename() throws Exception {
            // 创建目录
            fs.mkdirs(new Path("/a/b/c"));
            fs.mkdirs(new Path("/long/shi/san"));
            
            // 重命名文件或文件夹
            // fs.rename(new Path("/a"), new Path("/hahahahahaha"));
            
            // 删除文件夹,如果是非空文件夹,参数2必须给值为true
            // fs.delete(new Path("/hahahahahaha"),true);
        }

     

     查看文件目录

    输入:

    @Test
        public void testListFiles() throws FileNotFoundException, IllegalArgumentException, IOException {
            // 获取迭代器对象
            RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
            
            while(listFiles.hasNext()) {
                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());
                // 获取该文件块信息(包括长度,数据块,datanode的信息)
                BlockLocation[] blockLocations = fileStatus.getBlockLocations();
                
                for (BlockLocation blockLocation : blockLocations) {
                    System.out.println("block-length:"+blockLocation.getLength()+" -- "+"block-offset:"+blockLocation.getOffset());
                    String[] hosts = blockLocation.getHosts();
                    
                    for (String host : hosts) {
                        System.out.println(host);
                    }
                }
                System.out.println("--------------分割线---------");
            }
        }

    执行一下看看

    首先看一下我们hadoop目录下都有什么

     实验现象

     我们在d盘建立一个longshisan.txt传上去

    右击函数,选择Run As  进行测试

     

     第一个传输成功

     第二个下载成功

     第三个创建目录

    第四个重命名

     第五个删除

     最后一个

       

    今日HDFS访问结束!

  • 相关阅读:
    Sqlite官方的查询优化文档
    VC++动态链接库(DLL)编程深入浅出(三)转
    用Python查询手机号码归属地
    Delphi使用迅雷的开放下载引擎下载
    Android基础之一
    VC++动态链接库深入浅出(转)
    在Python脚本中使用Delphi控件
    Python与其他语言结合的参数转换函数PyArg_ParseTuple()
    设计模式之模板方法模式(Template)
    设计模式之简单工厂模式(Simple Factory)
  • 原文地址:https://www.cnblogs.com/longshisan/p/14888038.html
Copyright © 2011-2022 走看看