Java实现对Hadoop HDFS的API操作

1.配置Hadoop的Windows客户端

Hadoop 配置Windows 客户端

2.新建Maven项目[略]

3.添加依赖

        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>3.3.6</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-reload4j -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-reload4j</artifactId>
            <version>2.0.9</version>
        </dependency>

4.在项目的 src/main/resources目录下,新建日志配置文件,文件名为“log4j.properties”

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

5.新建测试类

package cn.coreqi.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;

/**
 * 客户端代码步骤
 * 1.首先获取一个客户端对象
 * 2.执行相关的操作命令
 * 3.关闭资源
 */
public class HdfsClient {

    /**
     * 客户端对象
     */
    private FileSystem fs;

    /**
     * 初始化客户端对象
     * @throws IOException
     * @throws InterruptedException
     * @throws URISyntaxException
     */
    @Before
    public void init() throws IOException, InterruptedException, URISyntaxException {
        // 需要连接的Hadoop NameNode地址
        URI uri = new URI("hdfs://192.168.58.130:8020");
        // 创建一个配置文件
        Configuration configuration = new Configuration();
        configuration.set("dfs.replication","7");   //设置默认副本数量为7
        // 用户
        String user = "root";
        // 获取客户端对象
        fs = FileSystem.get(uri, configuration,user);
    }

    /**
     * 释放客户端资源
     * @throws IOException
     */
    @After
    public void close() throws IOException {
        // 关闭资源
        fs.close();
    }

    /**
     * 创建目录
     * @throws IOException
     */
    @Test
    public void testMkdirs() throws IOException{
        // 创建一个文件夹
        fs.mkdirs(new Path("/coreqi"));
    }

    /**
     * 上传
     * @throws IOException
     */
    @Test
    public void testPut() throws IOException {
        // 参数解析
        // 参数一,表示是否删除源数据
        // 参数二,是否允许覆盖
        // 参数三,源数据路径
        // 参数四,目标路径
        //fs.copyFromLocalFile(false,false,new Path("C:\\Users\\fanqi\\Desktop\\bda6f29e-29de-4b9d-aa01-8c0fa850f99b.webp"),new Path("\\coreqi\\1.webp"));
        fs.copyFromLocalFile(false,false,new Path("C:\\Users\\fanqi\\Desktop\\bda6f29e-29de-4b9d-aa01-8c0fa850f99b.webp"),new Path("hdfs://192.168.58.130/coreqi/2.webp"));
    }

    /**
     * 下载
     * @throws IOException
     */
    @Test
    public void testGet() throws IOException {
        // 参数解析
        // 参数一,源文件是否删除
        // 参数二,源文件在HDFS中的路径
        // 参数三,目标地址路径
        // 参数四,是否开启文件校验
        fs.copyToLocalFile(false,new Path("hdfs://192.168.58.130/coreqi/2.webp"),new Path("D://2.webp"),false);
    }

    /**
     * 删除文件或文件夹
     */
    @Test
    public void testRm() throws IOException {
        // 参数解析
        // 参数一,删除的HDFS路径
        // 参数二,是否递归删除,对于非空的目录删除,此值需要配置为true
        fs.delete(new Path("hdfs://192.168.58.130/coreqi/2.webp"),false);
    }

    /**
     * 文件的更名或移动
     */
    @Test
    public void testMv() throws IOException {
        // 参数解析
        // 参数一,源文件路径
        // 参数二,目标文件路径
        //fs.rename(new Path("hdfs://192.168.58.130/coreqi/2.webp"),new Path("hdfs://192.168.58.130/coreqi/22.webp"));

        //文件移动并更名
        //fs.rename(new Path("hdfs://192.168.58.130/coreqi/22.webp"),new Path("hdfs://192.168.58.130/23.webp"));

        //文件夹重命名
        fs.rename(new Path("hdfs://192.168.58.130/coreqi"),new Path("hdfs://192.168.58.130/coreqir"));
    }

    /**
     * 获取文件详细信息
     */
    @Test
    public void fileDetail() throws IOException {
        // 获取所有文件信息
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);

        // 遍历文件
        while (listFiles.hasNext()) {
            LocatedFileStatus fileStatus = listFiles.next();
            System.out.println("=======" + fileStatus.getPath() + "=======");
            System.out.println(fileStatus.getPath().getName());

            //获取块信息
            BlockLocation[] blockLocations = fileStatus.getBlockLocations();
            System.out.println(Arrays.toString(blockLocations));
        }
    }

    /**
     * 判断是文件夹还是文件
     */
    @Test
    public void testFile() throws IOException {
        FileStatus[] listStatus = fs.listStatus(new Path("/"));
        for (FileStatus status : listStatus) {
            boolean isFile = status.isFile();
            System.out.println(isFile ? "文件 " : "目录 " + status.getPath().getName());
        }
    }
}
posted @ 2023-12-10 16:10  SpringCore  阅读(162)  评论(0编辑  收藏  举报