SpringBoot - 整合hadoop-client操作HDFS教程(附样例)
作者:hangge | 2024-06-21 08:30
在大数据处理领域,Hadoop 分布式文件系统(HDFS)是一个核心组件,负责存储和管理大规模数据集。本文将介绍如何在 Spring Boot 项目中整合 Hadoop 客户端,并展示具体的 HDFS 操作样例。
(2)在 application.properties 文件中配置 HDFS 连接信息:
(2)接着编写一个控制器用于测试 HDFS 的创建目录、删除目录或文件、创建文件、读取文件等操作:


(3)访问如下地址在 HDFS 中创建文件并写入测试内容:

1,准备工作
(1)在 Spring Boot 项目的 pom.xml 文件中添加 Hadoop 客户端的依赖:
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.2.0</version>
</dependency>
(2)在 application.properties 文件中配置 HDFS 连接信息:
hdfs.uri=hdfs://192.168.60.9:9000 hdfs.user=root
2,编写代码
(1)首先我编写一个 Hadoop 配置类 HadoopConfig,内容如下:
@Configuration // 声明这是一个配置类,用于定义 Bean
public class HadoopConfig {
@Value("${hdfs.uri}") // 从配置文件中读取 HDFS URI
private String hdfsUri;
@Value("${hdfs.user}") // 从配置文件中读取 HDFS 用户名
private String hdfsUser;
/**
* 配置并返回一个 Hadoop FileSystem 对象
*/
@Bean
public FileSystem fileSystem() throws IOException, InterruptedException {
// 创建一个新的 Hadoop 配置对象
org.apache.hadoop.conf.Configuration configuration = new org.apache.hadoop.conf.Configuration();
// 设置默认的文件系统 URI
configuration.set("fs.defaultFS", hdfsUri);
// 通过指定的 URI 和用户配置来获取 FileSystem 对象
FileSystem fileSystem = FileSystem.get(URI.create(hdfsUri), configuration, hdfsUser);
// 返回配置好的 FileSystem 对象
return fileSystem;
}
}
(2)接着编写一个控制器用于测试 HDFS 的创建目录、删除目录或文件、创建文件、读取文件等操作:
@RestController
@RequestMapping("/hdfs") // 指定控制器的基本路径
public class HdfsController {
@Autowired
private FileSystem fileSystem; // 自动注入 Hadoop 文件系统对象
/**
* 创建 HDFS 目录
* @param path 要创建的目录路径
* @return 创建成功返回 true,否则返回 false
*/
@GetMapping("/mkdir")
public boolean createDirectory(@RequestParam String path) throws IOException {
Path dirPath = new Path(path); // 将字符串路径转换为 Hadoop Path 对象
return fileSystem.mkdirs(dirPath); // 创建目录并返回操作结果
}
/**
* 删除 HDFS 目录或文件
* @param path 要删除的目录或文件路径
* @param recursive 是否递归删除,如果为目录且非空,需要设置为 true
* @return 删除成功返回 true,否则返回 false
*/
@GetMapping("/delete")
public boolean deleteDirectory(@RequestParam String path, @RequestParam boolean recursive)
throws IOException {
return fileSystem.delete(new Path(path), recursive); // 删除指定路径并返回操作结果
}
/**
* 在 HDFS 中创建文件并写入内容
* @param path 要创建的文件路径
* @param content 文件内容
* @return 创建成功返回 true,否则返回 false
*/
@GetMapping("/create")
public boolean createFile(@RequestParam String path, @RequestParam String content)
throws IOException {
Path filePath = new Path(path); // 将字符串路径转换为 Hadoop Path 对象
try (FSDataOutputStream outputStream = fileSystem.create(filePath)) { // 创建文件输出流
outputStream.write(content.getBytes()); // 写入内容
}
return fileSystem.exists(filePath); // 检查文件是否存在并返回结果
}
/**
* 读取 HDFS 文件内容
* @param path 要读取的文件路径
* @return 文件内容字符串,如果文件不存在则返回 null
*/
@GetMapping("/read")
public String readFile(@RequestParam String path) throws IOException {
Path filePath = new Path(path); // 将字符串路径转换为 Hadoop Path 对象
if (!fileSystem.exists(filePath)) { // 检查文件是否存在
return null; // 文件不存在,返回 null
}
try (FSDataInputStream inputStream = fileSystem.open(filePath)) { // 打开文件输入流
return new String(IOUtils.readFullyToByteArray(inputStream)); // 读取文件内容并转换为字符串返回
}
}
}
3,运行测试
(1)启动服务,首先访问如下接口地址创建一个 /hangge 目录:
http://localhost:8080/hdfs/mkdir?path=/hangge
- 可以看到 HDFS 上指定目录已经创建:

(2)访问如下接口地址删除 /hangge 目录:
http://localhost:8080/hdfs/delete?path=/hangge&recursive=true
- 可以看到 HDFS 上指定目录已经被删除:

http://localhost:8080/hdfs/create?path=/hangge/test.txt&content=欢迎访问hangge.com
- 可以看到指定文件已经被创建:

(4)访问如下地址读取 HDFS 上指定文件内容:
http://localhost:8080/hdfs/read?path=/hangge/test.txt
- 可以看到浏览器返回文件内容如下:
全部评论(0)