SpringBoot - 整合hadoop-client操作HDFS教程(附样例)
作者:hangge | 2024-06-21 08:30
在大数据处理领域,Hadoop 分布式文件系统(HDFS)是一个核心组件,负责存储和管理大规模数据集。本文将介绍如何在 Spring Boot 项目中整合 Hadoop 客户端,并展示具体的 HDFS 操作样例。
(2)在 application.properties 文件中配置 HDFS 连接信息:
(2)接着编写一个控制器用于测试 HDFS 的创建目录、删除目录或文件、创建文件、读取文件等操作:
![](http://hangge.com/blog_uploads/202405/2024052809454047270.png)
![](http://hangge.com/blog_uploads/202405/2024052809473916438.png)
(3)访问如下地址在 HDFS 中创建文件并写入测试内容:
![](http://hangge.com/blog_uploads/202405/2024052809502136660.png)
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 上指定目录已经创建:
![](http://hangge.com/blog_uploads/202405/2024052809454047270.png)
(2)访问如下接口地址删除 /hangge 目录:
http://localhost:8080/hdfs/delete?path=/hangge&recursive=true
- 可以看到 HDFS 上指定目录已经被删除:
![](http://hangge.com/blog_uploads/202405/2024052809473916438.png)
http://localhost:8080/hdfs/create?path=/hangge/test.txt&content=欢迎访问hangge.com
- 可以看到指定文件已经被创建:
![](http://hangge.com/blog_uploads/202405/2024052809502136660.png)
(4)访问如下地址读取 HDFS 上指定文件内容:
http://localhost:8080/hdfs/read?path=/hangge/test.txt
- 可以看到浏览器返回文件内容如下:
![](http://hangge.com/blog_uploads/202405/202405280953031018.png)
全部评论(0)