返回 导航

SpringBoot / Cloud

hangge.com

SpringBoot - 整合hadoop-client操作HDFS教程(附样例)

作者:hangge | 2024-06-21 08:30
    在大数据处理领域,Hadoop 分布式文件系统(HDFS)是一个核心组件,负责存储和管理大规模数据集。本文将介绍如何在 Spring Boot 项目中整合 Hadoop 客户端,并展示具体的 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

(2)访问如下接口地址删除 /hangge 目录:
http://localhost:8080/hdfs/delete?path=/hangge&recursive=true

(3)访问如下地址在 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)

回到顶部