搭建一个web服务下载hdfs的文件(代码片段)

老特拉福德小报 老特拉福德小报     2022-11-01     501

关键词:

需求描述

为了能方便快速的获取HDFS中的文件,简单的搭建一个web服务提供下载很方便快速,而且在web服务器端不留临时文件,只做stream中转,效率相当高!
使用的框架是SpringMVC+HDFS API

关键代码

@Controller
@RequestMapping("/file")
public class FileDownloadController 
     
     private static final String BASE_DIR = "/user/app/dump/";
    @RequestMapping(value = "/download/filename", method = RequestMethod.GET)
    @ResponseBody
    public void fileDownload(@PathVariable("filename") String fileName, HttpServletRequest request, HttpServletResponse response) 
        try 
            response.setContentType("application/octet-stream; charset=utf-8");
            response.addHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName + ".csv", "UTF-8"));
            String path = BASE_DIR + fileName;
            HdfsUtils.copyFileAsStream(path, response.getOutputStream());
         catch (Exception e) 
            e.printStackTrace();
        
    

HdfsUtils.copyFileAsStream 实现

public class HdfsUtils 
    private static FileSystem hdfs = null;
    static 
        URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
        Configuration conf=new Configuration();
        try 
            hdfs = FileSystem.get(URI.create("hdfs://xxxxxxx"), conf, "app");
         catch (Exception e) 
            e.printStackTrace();
         
    

    public static void copyFileAsStream(String fpath, OutputStream out) throws IOException, InterruptedException 
        org.apache.hadoop.fs.Path path = new org.apache.hadoop.fs.Path(fpath);
        FSDataInputStream fsInput = hdfs.open(path);
        IOUtils.copyBytes(fsInput, out, 4096, false);
        fsInput.close();
        out.flush();
    

是不是非常简单? HDFS的文件流没落在web服务上,而是直接copy到了浏览器的OutputStream上

更进一步提升性能,压缩

修改 web端的代码, 用zip进行压缩,默认的压缩比例是1:5,大大减少了流在网络上传输量

@Controller
@RequestMapping("/file")
public class FileDownloadController 
     private static final String BASE_DIR = "/user/app/dump/";
    
    @RequestMapping(value = "/download/zip/filename", method = RequestMethod.GET)
    @ResponseBody
    public void hdfsDownload2(@PathVariable("filename") String fileName, HttpServletRequest request, HttpServletResponse response) 
        try 
            response.setContentType("application/octet-stream; charset=utf-8");
            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName + ".zip", "UTF-8"));

            ZipOutputStream zipOut = null;
            try 
                zipOut = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));
                zipOut.putNextEntry(new ZipEntry(fileName + ".csv"));
             catch (Exception e) 
                e.printStackTrace();
            
            String path = BASE_DIR + fileName;
            HdfsUtils.copyFileAsStream(path, zipOut);
            zipOut.close();
         catch (Exception e) 
            e.printStackTrace();
        
    

一些用的主要jar版本

<properties>
    <spring.version>4.2.5.RELEASE</spring.version>
    <hadoop.version>2.7.0</hadoop.version>
</properties>

<dependencies>
  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>$spring.version</version>
  </dependency>
  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>$spring.version</version>
  </dependency>
  <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>$hadoop.version</version>
  </dependency>
  <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
      <version>$hadoop.version</version>
  </dependency>
</dependencies>

hdfs伪分布式环境搭建(代码片段)

HDFS概述及设计目标什么是HDFS:是Hadoop实现的一个分布式文件系统(HadoopDistributedFileSystem),简称HDFS源自于Google的GFS论文论文发表于2003年,HDFS是GFS的克隆版HDFS的设计目标:非常巨大的分布式文件系统运行在普通廉价的硬件上易... 查看详情

web开发使用apache搭建http下载服务器(代码片段)

...,正好手头上有台闲置的云服务器,于是就想来搭建一个文件下载服务,用户只需通过一个链接就能下载软件。Apache快速上手经过调研,发现Ubuntu采用Apache2这个软件就可以快速满足我的需求。安装Apache2apt-getinstall... 查看详情

hdfs环境搭建(单节点配置)(代码片段)

【参考文章】:hadoop集群搭建(hdfs)1.Hadoop下载  官网下载地址:  https://hadoop.apache.org/releases.html,进入官网根据自己需要下载具体的安装包  清华大学安装包的镜像文件下载地址:  https://mirrors.tuna.tsinghua.edu.cn/apache/h... 查看详情

hdfs伪分布式环境搭建(代码片段)

1HDFS概述及设计目标1.1什么是HDFS:Hadoop实现的一个分布式文件系统(HadoopDistributedFileSystem),简称HDFS源自于Google的GFS论文论文发表于2003年,HDFS是GFS的克隆版1.2HDFS的设计目标:非常巨大的分布式文件系统... 查看详情

大数据从0到一(hdfs)(代码片段)

...客户端同一机架储存—–>其他机架储存多份HDFS环境的搭建使用版本hadoop-2.6.0-cdh5.7.0下载地址:http://archive-primary.cloudera.com/cdh5/cdh/5/搜索hadoop-2.6cdh前提软件储备 查看详情

web开发使用apache搭建http下载服务器(代码片段)

...,正好手头上有台闲置的云服务器,于是就想来搭建一个文件下载服务,用户只需通过一个链接就能下载软件。Apache快速上手经过调研,发现Ubuntu采用Apache2这个软件就可以快速满足我的需求。安装Apache2apt-getinstall... 查看详情

配置xampp搭建简单的web服务器环境(代码片段)

1.下载xampp,地址:https://www.apachefriends.org/index.html2.解压并安装,一直next,直到安装成功。linux环境安装在/opt/lampp下3.配置虚拟路径  1)修改/opt/lampp/etc下的httpd-conf文件,window环境应该是apache目录下的httpd-conf文件    <Dire... 查看详情

搭建hdfs集群和yarn集群(代码片段)

...),会在任务失败以后能够自动的重新部署计算任务。4.搭建HDFS分布式文件系统以及Yarn集群1.得安装我们的hadoop- 查看详情

hadoop集群搭建(代码片段)

下载官网太慢了这里选用清华大学的镜像下载镜像地址下最后一个打开三台服务器将下载好的文件上传解压配置Hadoopcdhadoop-3.3.1/etc/hadoopvimhadoop-env.sh按G跳到最后一行直接在最后添加,配置登录用户exportJAVA_HOME=你的jdk解压位置exp... 查看详情

如何搭建一个简易的web框架(代码片段)

Web框架本质什么是Web框架,如何自己搭建一个简易的Web框架?其实,只要了解了HTTP协议,这些问题将引刃而解.  简单的理解: 所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端.用户在浏览器的地址栏... 查看详情

分布式文件系统(代码片段)

...的商业服务器上,基于第一条高容错性的优势,HDFS可以搭建在低成本的廉价服务器上,而没有必要选择非常昂贵的服务器上,因为即使廉价服务器稳定性相对较差,但是集群规模成百上千台宕机一台、两台对于整个HDFS集群来说... 查看详情

hdfs伪分布式环境搭建(代码片段)

 (一)、HDFSshell操作以上已经介绍了如何搭建伪分布式的Hadoop,既然环境已经搭建起来了,那要怎么去操作呢?这就是本节将要介绍的内容:HDFS自带有一些shell命令,通过这些命令我们可以去操作HDFS文件系统,这些命令与Li... 查看详情

javaweb--文件上传(代码片段)

文件下载1.准备工作(搭建项目)搭建一个web项目2.文件上传文件传输原理2.1依赖准备对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的。一般选择采用apache的开源工具common-fileupload这个文件上传组件... 查看详情

使用django建立一个最简单的服务器(代码片段)

Django作为python一个灵活性很强的网络框架,在搭建服务器方面非常的方便,通过以下几步就可以建立一个属于自己的web服务器:1.新建一个文件夹(尽量不要选择在系统盘,在搭建虚拟环境的时候会遇到很多的系统权限问题)2.... 查看详情

私服nexus搭建配置(代码片段)

应用场景java一些公共依赖的包,一般都放在私服,供编译(例如maven)时去下载,如果没有私服那么一些公共的组件包就需要去中央仓库下载,而中央仓库是外网存在访问速率的问题,而且还需要外网开放权限。再有如果依赖的... 查看详情

hdfs分布式集群(代码片段)

一、HDFS伪分布式环境搭建Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodityhardware)上的分布式文件系统。它和现有的分布式文件系统有很多共同点。但同时,它和其他的分布式文件系统的区别也是很明显的。HDFS是一... 查看详情

hdfs的datanode工作原理(代码片段)

...件块(block):最基本的存储单位。对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。HDFS默认Block大小是128MB,以一个256MB文... 查看详情

:spark环境搭建-local(代码片段)

...ker(HDFS\\YARN\\Spark)node3:Worker(HDFS\\YARN\\Spark)和Hive集群环境的搭建,同学们有2种选择:方式1:自行搭建同学们可以自行 查看详情