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

原文地址:https://www.cnblogs.com/xdr630/p/15254724.html