当前位置: 首页 > article >正文

将文件上传至hdfs(SpringBoot)

将文件上传至hdfs(SpringBoot)

1、依赖

  • <!--        Hadoop依赖-->
            <!-- Hadoop Client -->
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-client</artifactId>
                <version>3.3.1</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.slf4j</groupId>
                        <artifactId>slf4j-log4j12</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>javax.servlet</groupId>
                        <artifactId>servlet-api</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-common</artifactId>
                <version>3.3.1</version>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-hdfs</artifactId>
                <version>3.3.1</version>
            </dependency>
    

2、配置文件

  • server:
      port: 8686
    #HDFS配置
    hdfs:
      path: hdfs://192.168.44.128:9000
      user: hadoop
    
  • 主函数

    • @SpringBootApplication
      public class TrafficMainCodeApplication {
      
          public static void main(String[] args) {
              System.setProperty("HADOOP_USER_NAME","hadoop");
              SpringApplication.run(TrafficMainCodeApplication.class, args);
          }
      
      }
      

3、链接Hadoop工具类

  • package xyz.zzj.traffic_main_code.utils;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.security.UserGroupInformation;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    import java.io.IOException;
    
    @Component
    public class HadoopUtil {
        // 使用@Value注解读取application.yml文件中的hdfs.path属性值,并赋给path变量
        @Value("${hdfs.path}")
        private String path;
    
        // 使用@Value注解读取application.yml文件中的hdfs.user属性值,并赋给username变量
        @Value("${hdfs.user}")
        private String username;
    
        // 声明一个FileSystem类型的成员变量hdfs,用于存储HDFS文件系统的实例
        private FileSystem hdfs;
    
        /**
         * 获取HDFS文件系统对象的方法
         */
        public synchronized FileSystem getFileSystem() throws Exception {
            // 判断hdfs是否为空,如果为空则进行初始化操作
            if (hdfs == null) {
                // 创建一个新的Configuration对象conf,该对象用于配置Hadoop客户端的行为
                Configuration conf = new Configuration();
                // 设置默认文件系统URI为从配置文件读取的路径
                conf.set("fs.defaultFS", path);
                // 设置使用DataNode主机名而不是IP地址来连接DataNode
                conf.set("dfs.client.use.datanode.hostname", "true");
                // 禁用FileSystem缓存,确保每次获取的是新的FileSystem实例
                conf.setBoolean("fs.hdfs.impl.disable.cache", true);
                // 根据用户名创建UserGroupInformation对象ugi,用于身份验证
                UserGroupInformation ugi = UserGroupInformation.createRemoteUser(username);
                // 使用配置信息conf创建一个新的FileSystem实例,并赋给hdfs成员变量
                hdfs = FileSystem.newInstance(conf);
            }
            // 返回已初始化的hdfs文件系统对象
            return hdfs;
        }
    
        // 关闭HDFS文件系统的方法
        public void closeFileSystem() throws IOException {
            // 判断hdfs是否非空,如果是,则关闭hdfs文件系统
            if (hdfs != null) {
                hdfs.close();
            }
        }
    }
    

4、controller类

  • package xyz.zzj.traffic_main_code.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.multipart.MultipartFile;
    import xyz.zzj.traffic_main_code.service.FileService;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.List;
    
    @RestController
    @RequestMapping("/api/file")
    public class FileController {
    
        @Autowired
        private FileService fileUploadService;
    
        /**
         * 处理文件上传请求的方法
         *
         * @param file 上传的文件对象
         * @return ResponseEntity<String> 包含上传结果的状态码和消息
         */
        @PostMapping("/upload")
        public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file) {
            // 检查上传的文件是否为空
            if (!file.isEmpty()) {
                try {
                    // 构建临时文件路径,将文件保存到指定目录
                    String tempPath = "F:\\traffic_code\\traffic_main\\traffic_main_code\\src\\main\\resources\\static\\" + file.getOriginalFilename();
                    file.transferTo(new File(tempPath));
    
                    // 构建HDFS上的目标路径,并调用FileService将文件上传到HDFS
                    String hdfsPath = "/" + file.getOriginalFilename();
                    boolean success = fileUploadService.uploadFileToHdfs(tempPath, hdfsPath);
    
                    // 根据上传结果返回相应的响应实体
                    if (success) {
                        return ResponseEntity.ok("File uploaded successfully.");
                    } else {
                        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Failed to upload file.");
                    }
                } catch (IOException e) {
                    // 捕获并打印异常信息,返回服务器错误状态码及消息
                    e.printStackTrace();
                    return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error occurred during file upload.");
                }
            } else {
                // 如果上传的文件为空,则返回错误状态码及提示信息
                return ResponseEntity.badRequest().body("Please select a file to upload.");
            }
        }
    }
    

5、service类

  • package xyz.zzj.traffic_main_code.service;
    
    import org.apache.hadoop.fs.FSDataOutputStream;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import xyz.zzj.traffic_main_code.utils.HadoopUtil;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    
    @Service
    public class FileService {
    
        @Autowired
        private HadoopUtil hadoopUtil;
    
        /**
         * 将本地文件上传到HDFS的方法
         *
         * @param localFilePath  本地文件路径
         * @param remoteFilePath HDFS上的目标文件路径
         * @return boolean 表示上传是否成功
         */
        public boolean uploadFileToHdfs(String localFilePath, String remoteFilePath) {
            try (FileSystem fs = hadoopUtil.getFileSystem(); // 获取HDFS文件系统对象
                 FSDataOutputStream outputStream = fs.create(new Path(remoteFilePath))) { // 在HDFS上创建输出流
                Files.copy(Paths.get(localFilePath), outputStream); // 将本地文件复制到HDFS
                return true; // 返回true表示上传成功
            } catch (Exception e) {
                e.printStackTrace(); // 捕获并打印异常信息
                return false; // 返回false表示上传失败
            }
        }
    }
    

6、上传示例

  • image-20250106192137420

http://www.kler.cn/a/474259.html

相关文章:

  • 测试开发基础知识2
  • 【杂谈】-50+个生成式人工智能面试问题(一)
  • 大数据技术 指令笔记1
  • 微服务拆分的艺术:构建高效、灵活的系统架构
  • 基于YOLO5的机械臂视觉抓取实现
  • Leffa 虚拟试衣论文笔记
  • 阿里云 AI 搜索方案解读:大模型驱动下的智能搜索,助力企业数字化转型
  • 2024大模型安全研究方向总结(附实践资料)
  • ZYNQ初识8(zynq_7010)FIFO_IP核
  • 【银河麒麟高级服务器操作系统】服务器异常重启故障分析及处理建议
  • RoBERTa: A Robustly Optimized BERT Pretraining Approach—— 一种鲁棒优化的BERT预训练方法
  • C语言——结构体,位段,枚举和联合
  • failed to resolve sdk 的解决方法
  • 华为设备的监控和管理
  • 基于Spring Boot的车辆违章信息管理系统(LW+源码+讲解)
  • 开源AI智能名片商城小程序在个人品牌建设中的应用与“展温度”策略融合深度探索
  • 【线性代数】通俗理解特征向量与特征值
  • 【Logstash03】企业级日志分析系统ELK之Logstash 过滤 Filter 插件
  • 9 异常
  • PyTorch快速入门教程【小土堆】之完整模型验证套路
  • 网络安全系列 之 协议安全
  • ros2-4.2 用python实现人脸识别
  • 服务器证书不受信任是什么问题?
  • 有关Redis的相关概述
  • Linux(CentOS7)安装JDK和Maven
  • Unity导入特效,混合模式无效问题