在IDEA中创建maven项目编写java代码操作HDFS集群

2023-05-16

一、安装win10编译过的hadoop

1、将编译好的hadoop包放在非中文目录

在这里插入图片描述
2、配置HADOOP_HOME环境变量
在这里插入图片描述

3、将hadoop包的bin目录加到PATH环境变量中
在这里插入图片描述

二、在idea中创建一个maven项目

1、创建maven项目
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
2、导入相应的依赖坐标+日志添加
在这里插入图片描述在pom.xml文件中添加:

<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
			<version>2.8.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-common</artifactId>
			<version>2.7.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-client</artifactId>
			<version>2.7.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-hdfs</artifactId>
			<version>2.7.2</version>
		</dependency>
		<dependency>
			<groupId>jdk.tools</groupId>
			<artifactId>jdk.tools</artifactId>
			<version>1.8</version>
			<scope>system</scope>
			<systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
		</dependency>
</dependencies>

3、编辑"log4j.properties"文件
需要在项目的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

这样就可以在控制台中打印出日志

三、利用api编写java代码操作hdfs集群

需要在项目的src/main/java目录下,新建一个包,命名为hdfs。在包下创建一个类HdfsClient,编写的java代码如下:

package hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.junit.Test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

/**
 * @description: hdfs客户端java代码实现操作hdfs文件系统
 * @author: hyr
 * @time: 2020/2/2 10:30
 */
public class HdfsClient {
    // 一、hdfs创建目录
    @Test
    public void testMkdirs() throws URISyntaxException, IOException, InterruptedException {
        // 1、获取文件系统
        Configuration configuration = new Configuration();

        // 2、配置在集群上运行
//        configuration.set("fs.defaultFS", "hdfs://192.168.1.151:9000");
//        FileSystem fs = FileSystem.get(configuration);

        // 2、配置在集群上运行
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.1.151:9000"), configuration, "test");

        // 3、创建目录
        fs.mkdirs(new Path("/0202/aa/cc"));

        // 4、关闭资源
        fs.close();
    }

    // 二、HDFS文件上传
    @Test
    public void testCopyFromLocalFile() throws URISyntaxException, IOException, InterruptedException {
        // 1、获取文件系统
        Configuration configuration = new Configuration();

        // 2、设置副本数
        configuration.set("dfs.replication", "2");

        // 3、配置在集群上运行
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.1.151:9000"), configuration, "test");

        // 4、上传文件
        fs.copyFromLocalFile(new Path("D:/123.txt"), new Path("/baozhu.txt"));

        // 5、关闭资源
        fs.close();
    }

    // 三、HDFS文件下载
    @Test
    public void testCopyToLocalFile() throws URISyntaxException, IOException, InterruptedException {
        // 1、获取文件系统
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.1.151:9000"), configuration, "test");

        // 2、执行下载操作
        // boolean delSrc:是指是否将原文件删除
        // Path src:指要下载的文件路径
        // Path dst:指将文件下载到的路径
        // boolean useRawLocalFileSystem:是否开始文件校验
        fs.copyToLocalFile(false, new Path("/jdk-8u144-linux-x64.tar.gz"), new Path("D:/jdk-8u144-linux-x64.tar.gz"), true);

        // 3、关闭资源
        fs.close();
    }

    // 四、HDFS文件夹删除
    @Test
    public void testDelete() throws URISyntaxException, IOException, InterruptedException {
        // 1、获取文件系统
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.1.151:9000"), configuration, "test");

        // 2、执行删除
        fs.delete(new Path("/sanguo"), true);

        // 3、关闭资源
        fs.close();
    }

    // 五、HDFS文件名更改
    @Test
    public void testRename() throws URISyntaxException, IOException, InterruptedException {
        // 1、获取文件系统
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.1.151:9000"), configuration, "test");

        // 2、修改文件名称
        fs.rename(new Path("/baozhu.txt"), new Path("/bao.txt"));

        // 3、关闭资源
        fs.close();
    }

    // 六、HDFS文件详情查看
    @Test
    public void testListFiles() throws URISyntaxException, IOException, InterruptedException {
        // 1、获取文件系统
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.1.151:9000"), configuration, "test");

        // 2、获取文件详情
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);

        // 3、循环遍历迭代器
        while (listFiles.hasNext()) {
            LocatedFileStatus status = listFiles.next();

            // 输出详情
            // 文件名称
            System.out.println(status.getPath().getName());
            // 长度
            System.out.println(status.getLen());
            // 权限
            System.out.println(status.getPermission());
            // 分组
            System.out.println(status.getGroup());

            // 获取存储的块信息
            BlockLocation[] blockLocations = status.getBlockLocations();

            for (BlockLocation blockLocation : blockLocations) {
                // 获取块存储的主机节点
                String[] hosts = blockLocation.getHosts();

                for (String host : hosts) {
                    System.out.println(host);
                }
            }
            System.out.println("------------------分割线----------------");
        }
        // 4、关闭资源
        fs.close();
    }

    // 七、HDFS文件和文件夹判断
    @Test
    public void testListStatus() throws URISyntaxException, IOException, InterruptedException {
        // 1、获取文件配置信息
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.1.151:9000"), configuration, "test");

        // 2、判断是文件还是文件夹
        FileStatus[] listStatus = fs.listStatus(new Path("/"));

        for (FileStatus fileStatus : listStatus) {
            // 如果是文件
            if (fileStatus.isFile()) {
                System.out.println("f:" + fileStatus.getPath().getName());
            } else {
                System.out.println("d:" + fileStatus.getPath().getName());
            }
        }

        // 3、关闭资源
        fs.close();
    }

    // 八、HDFS的I/0操作
    // 上面我们学的API操作HDFS系统都是框架封装好的,那么如果我们想自己实现
    // 上述API的操作该怎么实现呢?
    // 我们可以采用IO流的方式实现数据的上传和下载
    // 8.1 HDFS文件上传
    @Test
    public void putFileToHDFS() throws URISyntaxException, IOException, InterruptedException {
        // 1、获取文件系统
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.1.151:9000"), configuration, "test");

        // 2、创建输入流
        FileInputStream fis = new FileInputStream(new File("D:/123.txt"));

        // 3、获取输出流
        FSDataOutputStream fos = fs.create(new Path("/abc.txt"));

        // 4、流对拷
        IOUtils.copyBytes(fis, fos, configuration);

        // 5、关闭资源
        IOUtils.closeStream(fos);
        IOUtils.closeStream(fis);
        fs.close();
    }

    // 8.2 HDFS文件下载
    @Test
    public void getFileFromHDFS() throws URISyntaxException, IOException, InterruptedException {
        // 1、获取文件系统
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.1.151:9000"), configuration, "test");

        // 2、获取输入流
        FSDataInputStream fis = fs.open(new Path("/baozhu.txt"));

        // 3、获取输出流
        FileOutputStream fos = new FileOutputStream(new File("D:/test.txt"));

        // 4、流的对拷
        IOUtils.copyBytes(fis, fos, configuration);

        // 5、关闭资源
        IOUtils.closeStream(fos);
        IOUtils.closeStream(fis);
        fs.close();
    }

    // 8.3 HDFS定位文件读取
    // 下载第一块
    @Test
    public void readFileSeek1() throws URISyntaxException, IOException, InterruptedException {
        // 1、获取文件系统
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.1.151:9000"), configuration, "test");

        // 2、获取输入流
        FSDataInputStream fis = fs.open(new Path("/hadoop-2.7.2.tar.gz"));

        // 3、创建输出流
        FileOutputStream fos = new FileOutputStream(new File("D:/hadoop-2.7.2.tar.gz.part1"));

        // 4、流的拷贝
        byte[] buf = new byte[1024];

        for (int i = 0; i < 1024 * 128; i++) {
            fis.read(buf);
            fos.write(buf);
        }

        // 5、关闭资源
        IOUtils.closeStream(fis);
        IOUtils.closeStream(fos);
        fs.close();
    }

    // 下载第二块
    @Test
    public void readFileSeek2() throws IOException, InterruptedException, URISyntaxException {
        // 1 获取文件系统
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.1.151:9000"), configuration, "atguigu");

        // 2 打开输入流
        FSDataInputStream fis = fs.open(new Path("/hadoop-2.7.2.tar.gz"));

        // 3 定位输入数据位置
        fis.seek(1024 * 1024 * 128);

        // 4 创建输出流
        FileOutputStream fos = new FileOutputStream(new File("D:/hadoop-2.7.2.tar.gz.part2"));

        // 5 流的对拷
        IOUtils.copyBytes(fis, fos, configuration);

        // 6 关闭资源
        IOUtils.closeStream(fis);
        IOUtils.closeStream(fos);
    }
}

四、软件包地址

有hadoop2.7.2 win10版 以及 jdk1.8 windows版
在进行以上操作之前,要先安装jdk,配置JAVA_HOME,软件链接如下:
https://pan.baidu.com/s/1x3EORUC8_ehfNP08idBOaw

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在IDEA中创建maven项目编写java代码操作HDFS集群 的相关文章

随机推荐