Skip to content

HDFS的API操作

本地开发Hadoop应用程序基本都是在Windows环境中,所以需要提前搭建配置Windows环境。

1. 搭建windows版hadoop环境

  1. 解压缩hadoop-3.3.6.tar.gz到非中文目录下
  2. 访问https://gitee.com/javaee_home/hadoopcompiler 下载的文件拷贝到bin目录中
  3. 在windows环境变量配置HADOOP_HOME和Path Alt text
  4. 命令行窗口测试
sh
C:\Users\mi>yarn version
Hadoop 3.3.6
Source code repository https://github.com/apache/hadoop.git -r 1be78238728da9266a4f88195058f08fd012bf9c
Compiled by ubuntu on 2023-06-18T08:22Z
Compiled on platform linux-x86_64
Compiled with protoc 3.7.1
From source with checksum 5652179ad55f76cb287d9c633bb53bbd
This command was run using /D:/hadoop-3.3.6/share/hadoop/common/hadoop-common-3.3.6.jar

2. 创建Maven工程

pom.xml文件如下

xml
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>3.3.6</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.36</version>
</dependency>

3. 使用代码操作HDFS

3.1 创建目录

java
// 1 获取文件系统
Configuration configuration = new Configuration();

FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration,"jack");

// 2 创建目录
fs.mkdirs(new Path("/xiyou/huaguoshan/"));

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

执行效果: Alt text

3.2 上传文件

java
// 2 上传文件 
// boolean delSrc 指是否将源文件删除
// Path src 指要上传的文件路径
// Path dst 指将文件上传到的路径
Path path = new Path("D:\\BaiduNetdiskDownload\\随堂笔记.txt"); 
fs.copyFromLocalFile(true, path, new Path("/xiyou/huaguoshan/"), true);

Alt text

3.3 HDFS文件下载

java
// 2 执行下载操作
// boolean delSrc 指是否将原文件删除
// Path src 指要下载的文件路径
// Path dst 指将文件下载到的路径
// boolean useRawLocalFileSystem 是否开启文件校验, false将提供crc校验码
fs.copyToLocalFile(false, new Path("/xiyou/huaguoshan/随堂笔记.txt"), new Path("e:/download_hdfs/"), false);

运行效果: Alt text

3.4 HDFS文件删除

java
// 2 执行删除, 第二个参数:是否需要递归删除
fs.delete(new Path("/xiyou/huaguoshan"), false);

如果目录不为空会报错,此时需要递归删除,第二个参数配置为true: Alt text

3.5 HDFS文件更名和移动

java
// 文件修改名称
fs.rename(new Path("/xiyou/huaguoshan/随堂笔记.txt"), new Path("/xiyou/huaguoshan/学习笔记.txt"));
// 文件移动并改名
fs.rename(new Path("/xiyou/huaguoshan/学习笔记.txt"), new Path("/user/jack/study_note.txt"));
// 目录的更名
fs.rename(new Path("/xiyou/huaguoshan"), new Path("/xiyou/huaguoshan2"));

运行效果: Alt text

3.6 获取HDFS文件详情

java
// 获取文件详情。/ 表示所有文件
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);

while (listFiles.hasNext()) {
    LocatedFileStatus fileStatus = listFiles.next();
    // 读取信息
    System.out.print(fileStatus.getPath()+"\t");
    System.out.print(fileStatus.getPermission()+"\t");
    System.out.print(fileStatus.getOwner()+"\t");
    System.out.print(fileStatus.getGroup()+"\t");
    System.out.print(fileStatus.getLen()+"\t");
    System.out.print(fileStatus.getModificationTime()+"\t");
    System.out.print(fileStatus.getReplication()+"\t");
    System.out.print(fileStatus.getBlockSize()+"\t");
    System.out.print(fileStatus.getPath().getName()+"\t");

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

Alt text

3.7 HDFS文件和文件夹判断

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

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

运行结果: Alt text

4. HDFS参数优先级

参数优先级排序:客户端代码中设置的值 > ClassPath下的用户自定义配置文件 > 然后是服务器的自定义配置(xxx-site.xml) > 服务器的默认配置(xxx-default.xml)。
在Maven项目中resource下创建hdfs-site.xml副本参数是1, 代码中配置副本参数是2,另外HDFS服务器中副本默认是3,进行代码验证:

xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>
java
// 1 获取文件系统
Configuration configuration = new Configuration();
// 配置参数
configuration.set("dfs.replication", "2");
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration,"jack");

// 2 创建目录
//fs.mkdirs(new Path("/xiyou/huaguoshan/"));

// 3. 文件上传, 没有put的api,但是有copyFromLocalFile等效
// 参数优先级
Path path = new Path("C:\\Users\\mi\\Desktop\\yl.sql");
fs.copyFromLocalFile(false, path, new Path("/xiyou/huaguoshan/"));

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

运行效果: Alt text