HDFS Java 客户端 API

2021-06-11 19:11:11 浏览数 (1)

文章目录

  • 1. 概述
  • 2. 客户端核心类
  • 3. IDEA创建工程项目
  • 4. 添加maven依赖和编译打包插件
  • 5. 创建Junit单元测试
  • 6. 创建文件夹
  • 7. 执行报错:客户端没有权限
  • 8. 创建文件夹完整代码
  • 9. 上传文件
  • 10. 下载文件

1. 概述

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

2. 客户端核心类

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

3. IDEA创建工程项目

  • 创建一个Maven项目
  • 添加maven依赖和编译打包插件

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

代码语言:javascript复制
<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单元测试

代码语言:javascript复制
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. 创建文件夹

代码语言:javascript复制
 /**
     * 创建文件夹操作
     *
     */
    @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操作权限
代码语言:javascript复制
@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. 创建文件夹完整代码

代码语言:javascript复制
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. 上传文件

代码语言:javascript复制
/**
 * 上传文件
 */
	@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. 下载文件

代码语言:javascript复制
  /**
   * 下载文件
   */
  @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);
  }

0 人点赞