HDFS作为Hadoop实现的其中一个文件系统,除了能使用Shell操作HDFS的文件和目录之外,还可以通过HDFS提供的Java API操作HDFS的文件和目录。
在HDFS Java API中,常用的一个核心包为org.apache.hadoop.fs,该包提供了常用的FileSystem、FileStatus、FSDataInputStream、FSDataOutputStream和Path类。

FileSystem类:用于介绍为对文件进行一系列操作。
FileStatus类:该类用于向客户端展示HDFS中文件和目录的元数据,包括文件大小、Block大小、副本信息和修改时间等。
FSDataInputStream类:表示HDFS输入流,用于实现HDFS写入文件的操作。
FSDataOutputStream类:表示HDFS输出流,用于实现HDFS读取文件的操作。
Path类:表示HDFS中的一个目录或一个文件路径。
HDFS中对文件的一系列操作,通常使用org.apache.hadoop.fs包下的FileSystem类实现,以下是FileSystem常用的几个方法介绍:
在这里插入图片描述

在这里插入图片描述
直接next,采用默认的安装方式就可以了。打开Idea
在这里插入图片描述

在这里插入图片描述
创建完maven项目之后,会生成pom.xml文件,编辑pom文件,配置jar包的版本号和名称,把运行hadoop程序所依赖的jar包配置好之后重新加载,idea就会自动下载所需要的jar包,显示在External Libraries文件列表中。
在这里插入图片描述
下面是pom的具体内容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>hadooptest</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
</project>

由于maven默认配置的是国外的镜像库,如果下载不下来相应的jar包,可以更改maven的仓库源地址
在这里插入图片描述
可以右键创建setting.xml,或者是打开C:\Users\Administrator.m2\目录,在这个目录里面创建setting.xml,更改settting.xml为下面内容,这里把maven的镜像源设置为阿里云的公共仓库从而实现Hadoop的jar包下载

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <mirrors>
        <mirror>
            <id>alimaven</id>
            <mirrorOf>central</mirrorOf>
            <name>阿里云公共仓库</name>
            <url>https://maven.aliyun.com/repository/public</url>
        </mirror>
    </mirrors>
</settings>

新建HDFS_CURD类去测试用java操作HDFS

package cn.itcast.hdfsdemo;

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

import java.io.FileNotFoundException;
import java.io.IOException;

public class HDFS_CURD {
    FileSystem fs = null;

    @Before
    public void init() throws Exception {
        //获取config对象
        Configuration conf = new Configuration();
        //设置hadoop集群的通信地址,采用的是用虚拟机已经搭建好的hadoop集群,通信端口是hadoop1:9000
        conf.set("fs.defaultFS", "hdfs://hadoop1:9000");
        //设置hadoop的用户操作
        System.setProperty("HADOOP_USER_NAME", "root");
        //获取filesystem对象
        fs = FileSystem.get(conf);
    }

    //注解Test用于在Junit单元测试框架中测试方法testAddFileToHdfs()
    @Test
    public void testAddFileToHdfs() throws IOException {
        // 指定本地文件系统上传的文件
        Path src = new Path("D:\\upload\\test.txt");
        // 指定将文件上传到HDFS的目录
        Path dst = new Path("/testFile");
        fs.copyFromLocalFile(src, dst);
        // 关闭资源
        fs.close();
    }

    @Test
    public void testDownloadFileToLocal() throws IllegalArgumentException,
            IOException {
        fs.copyToLocalFile(
                new Path("/testFile/test.txt"),
                new Path("D:\\downloadFile"));
    }

    @Test
    public void testMkdirAndDeleteAndRename() throws Exception {
        fs.mkdirs(new Path("/a/b/c"));
        fs.mkdirs(new Path("/a2/b2/c2"));
        fs.rename(new Path("/a"), new Path("/a3"));
        fs.delete(new Path("/a2"), true);
    }

    @Test
    public void testListFiles() throws FileNotFoundException,
            IllegalArgumentException, IOException {
        RemoteIterator<LocatedFileStatus> listFiles =
                fs.listFiles(new Path("/car"), true);
        while (listFiles.hasNext()) {
            LocatedFileStatus fileStatus = listFiles.next();
            System.out.println("文件名:" + fileStatus.getPath().getName());
            System.out.println("文件的副本数:" + fileStatus.getReplication());
            System.out.println("文件的权限:" + fileStatus.getPermission());
            System.out.println("文件大小:" + fileStatus.getLen() + "字节");
            BlockLocation[] blockLocations =
                    fileStatus.getBlockLocations();
            for (BlockLocation bl : blockLocations) {
                String[] hosts = bl.getHosts();
                System.out.println("文件的Block所在虚拟机的主机名:");
                for (String host : hosts) {
                    System.out.println(host);
                }
            }
            System.out.println("----------------------------");
        }
    }
}

更多推荐