• HDFS Java 客户端 API


    1. 概述

    • HDFS在生产应用中主要是Java客户端的开发,其核心步骤是从HDFS提供的API中构造一个HDFS的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS上的文件。

    2. 客户端核心类

    • Configuration 配置对象类,用于加载或设置参数属性
    • FileSystem 文件系统对象基类。针对不同文件系统有不同具体实现。该类封装了文件系统的相关操作方法。

    3. IDEA创建工程项目

    • 创建一个Maven项目
      在这里插入图片描述
    • 添加maven依赖和编译打包插件

    4. 添加maven依赖和编译打包插件

    <dependencies>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-common</artifactId>
                <version>3.1.4</version>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-client</artifactId>
                <version>3.1.4</version>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-hdfs</artifactId>
                <version>3.1.4</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    

    5. 创建Junit单元测试

    package com.xdr630.hdfs;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.junit.After;
    import org.junit.Before;
    
    import java.io.IOException;
    
    /**
     * @author xdr630
     * @version 1.0
     * @date 2021/4/5 21:51
     */
    public class HDFSClientTest {
        private static Configuration conf = null;
        private static FileSystem fs = null;
    
        /**
         * 初始化方法 用于和hdfs集群建立连接
         *
         * @throws IOException
         */
        @Before
        public void connect2HDFS() throws IOException {
            //创建配置对象实例
            Configuration conf = new Configuration();
            //设置操作的文件系统是 HDFS ,并且指定HDFS操作地址,在/export/servers/hadoop-2.7.4/etc/hadoop/ 下的core-site.xml
            conf.set("fs.defaultFS","hdfs://hadoop01:9000");
            //创建FileSystem对象
            fs = FileSystem.get(conf);
        }
    
        /**
         * 关闭客户端和hdfs连接
         * @throws IOException
         */
        @After
        public void close(){
            //首先判断文件系统实例是否为null,如果不为null,进行关闭
            if (fs!=null){
                try {
                    fs.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    

    6. 创建文件夹

     /**
         * 创建文件夹操作
         *
         */
        @Test
        public void mkdir() throws IOException {
            //首先判断文件夹是否存在,如果不存在再创建
            if(!fs.exists(new Path("/xdr630"))){
                //创建文件夹
                fs.mkdirs(new Path("/xdr630"));
            }
        }
    

    7. 执行报错:客户端没有权限

    在这里插入图片描述

    • 原因:以Windows登录用户访问HDFS,而该用户不具备在HDFS操作权限
    • 解决
      1、修改HDFS文件系统权限
      2、或者设置客户端身份,该身份具备在HDFS操作权限
    @Before
        public void connect2HDFS() throws IOException {
            //设置客户端身份信息,以备在hdfs上进行操作
            System.setProperty("HADOOP_USER_NAME","root");
            //创建配置对象实例
             conf = new Configuration();
            //设置操作的文件系统是 HDFS ,并且指定HDFS操作地址,在/export/servers/hadoop-2.7.4/etc/hadoop/ 下的core-site.xml
            conf.set("fs.defaultFS","hdfs://192.168.121.134:9000");
            //创建FileSystem对象
            fs = FileSystem.get(conf);
        }
    
    • core-site.xml
      在这里插入图片描述

    8. 创建文件夹完整代码

    package com.xdr630.hdfs;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import java.io.IOException;
    
    /**
     * @author xdr630
     * @version 1.0
     * @date 2021/4/5 21:51
     */
    public class HDFSClientTest {
        private static Configuration conf = null;
        private static FileSystem fs = null;
    
        /**
         * 初始化方法 用于和hdfs集群建立连接
         *
         * @throws IOException
         */
        @Before
        public void connect2HDFS() throws IOException {
            //设置客户端身份信息,以备在hdfs上进行操作
            System.setProperty("HADOOP_USER_NAME","root");
            //创建配置对象实例
             conf = new Configuration();
            //设置操作的文件系统是 HDFS ,并且指定HDFS操作地址,在/export/servers/hadoop-2.7.4/etc/hadoop/ 下的core-site.xml
            conf.set("fs.defaultFS","hdfs://192.168.121.134:9000");
            //创建FileSystem对象
            fs = FileSystem.get(conf);
        }
        /**
         * 创建文件夹操作
         *
         */
        @Test
        public void mkdir() throws IOException {
            //首先判断文件夹是否存在,如果不存在再创建
            if(!fs.exists(new Path("/xdr630"))){
                //创建文件夹
                fs.mkdirs(new Path("/xdr630"));
            }
        }
        /**
         * 关闭客户端和hdfs连接
         * @throws IOException
         */
        @After
        public void close(){
            //首先判断文件系统实例是否为null,如果不为null,进行关闭
            if (fs!=null){
                try {
                    fs.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    • 执行 @test 后 :
      在这里插入图片描述

    9. 上传文件

    /**
     * 上传文件
     */
    	@Test
    	public void  putFile2HDFS() throws IOException {
    	    //创建本地文件路径
    	    Path src = new Path("D:/input/xdr01.txt");
    	    // hdfs上传路径
    	    Path dst = new Path("/xdr630/xdr01.txt");
    	    //文件上传(local->hdfs)
    	    fs.copyFromLocalFile(src,dst);
    	}
    

    在这里插入图片描述

    在这里插入图片描述

    10. 下载文件

      /**
       * 下载文件
       */
      @Test
      public void  getFile2Local() throws IOException {
          //hdfs路径
          Path src = new Path("/xdr630/xdr01.txt");
          // 本地路径
          Path dst = new Path("E:/xdr01.txt");
          //文件下载(hdfs->local)
         fs.copyToLocalFile(src,dst);
      }
    

    在这里插入图片描述

    本文来自博客园,作者:兮动人,转载请注明原文链接:https://www.cnblogs.com/xdr630/p/15254724.html

  • 相关阅读:
    让 vscode 作为 SpringBoot,Java,Maven,甚至于 JavaScript,C,C++,Python,Php等多语言的开发工具吧!
    MySQL 连接错误集锦
    前端开发工具库:包含事件委托,动画处理,以及大部分常用的前端工具
    初探 Node.js 框架:eggjs (环境搭配篇)
    如何快速搭建一个 Node.JS 项目并进入开发?
    关于 JavaSrcipt 前端开发的建议:模块化开发
    Spring-Session 会话共享 -> 基于 Redis 集群,内附各大错误合集,包括配置,类寻找不到、连接错误等
    Java Email 邮件发送
    CSS 显示或隐藏子元素
    Ubuntu美化及配置,常见问题解决方案(仿 Mac 风格)
  • 原文地址:https://www.cnblogs.com/xdr630/p/15254724.html
Copyright © 2020-2023  润新知