大数据项目(一):Hadoop 云网盘管理系统开发实践

文章目录

Hadoop 云网盘管理系统开发实践

基于 SSM 框架 + HDFS 分布式存储的企业级云盘系统

复制代码
Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊!
喜欢我的博客的话,记得点个红心❤️和小关小注哦!您的支持是我创作的动力!(有什么问题可以私信)

前言

在日常工作和学习中,我们经常需要管理大量的文档资料。传统的本地存储方式存在诸多不便:文件分散难以统一管理、跨设备访问困难、数据安全性无法保障等。因此,我开发了 NetWorkBase ------ 一个基于云端的文档管理系统。

本文将详细介绍这个项目的设计思路、技术选型、核心功能实现以及踩坑经验,希望能为有类似开发需求的朋友提供一些参考。


一、项目概述

NetWorkBase 是一个面向个人和小型团队的云文档管理系统,主要特点包括:

  • 云端存储 :采用 Hadoop HDFS 作为分布式存储后端,突破单机存储限制

  • 文档管理 :支持文件上传、下载、分类、搜索、排序等功能

  • 数据分析 :提供下载统计分析,包括趋势图和排行榜

  • 简洁易用 :采用响应式设计,界面简洁直观

核心功能清单

功能模块 功能列表
用户管理 注册、登录、修改密码、头像设置
文档管理 上传、下载、搜索、排序、分类显示、批量删除
HDFS 集成 分布式存储、目录管理、文件读写
数据统计 下载趋势、文档排行、用户活跃度

二、技术架构

2.1 技术栈选择

本项目采用经典的 SSM 架构,结合大数据组件进行扩展:

复制代码
┌─────────────────────────────────────────────────────────┐
│                      前端层                              │
│   JSP + jQuery + Bootstrap + ECharts                    │
├─────────────────────────────────────────────────────────┤
│                     控制层                               │
│   Spring MVC (Controller)                               │
├─────────────────────────────────────────────────────────┤
│                     业务层                               │
│   Spring Framework 5.2.8                                │
├─────────────────────────────────────────────────────────┤
│                     持久层                               │
│   MyBatis 3.5.19 + MySQL 8.0                            │
├─────────────────────────────────────────────────────────┤
│                     存储层                               │
│   Hadoop HDFS 3.3.0 + C3P0 连接池                       │
└─────────────────────────────────────────────────────────┘

2.2 技术选型理由

技术 选用理由
Spring 5.2.8 成熟的 IOC/AOP 容器,管理对象生命周期
MyBatis 3.5.19 灵活的 SQL 映射,学习成本低
MySQL 8.0 支持 JSON、窗口函数等新特性
Hadoop HDFS 开源分布式存储,可靠性高
ECharts 图表丰富,文档完善
PageHelper 无侵入式分页,集成简单

三、数据库设计

3.1 ER 图

复制代码
┌──────────────┐       ┌──────────────┐       ┌──────────────┐
│    user      │       │    docs      │       │   downlog    │
├──────────────┤       ├──────────────┤       ├──────────────┤
│ id           │       │ id           │       │ id           │
│ zh (账号)    │       │ title        │       │ title        │
│ mm (密码)    │       │ type         │       │ author       │
│ name         │       │ url          │       │ downdate     │
│ avatar       │◄──────│ filesize     │       │ num          │
│              │       │ author ──────┼──────►│              │
│              │       │ createdate   │       │              │
└──────────────┘       └──────────────┘       └──────────────┘

3.2 核心表结构

sql 复制代码
-- 用户表
CREATE TABLE `user` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `zh` VARCHAR(50) NOT NULL COMMENT '账号',
    `mm` VARCHAR(100) NOT NULL COMMENT '密码(MD5)',
    `name` VARCHAR(50) DEFAULT NULL COMMENT '姓名',
    `avatar` TEXT COMMENT '头像数据',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_zh` (`zh`)
);

-- 文档表
CREATE TABLE `docs` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `title` VARCHAR(200) NOT NULL COMMENT '文档标题',
    `type` VARCHAR(50) DEFAULT NULL COMMENT '文档类型',
    `url` VARCHAR(500) NOT NULL COMMENT 'HDFS路径',
    `filesize` VARCHAR(50) DEFAULT NULL COMMENT '文件大小',
    `author` VARCHAR(50) DEFAULT NULL COMMENT '作者',
    `createdate` DATETIME DEFAULT NULL COMMENT '创建时间',
    PRIMARY KEY (`id`)
);

-- 下载日志表
CREATE TABLE `downlog` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `title` VARCHAR(200) DEFAULT NULL COMMENT '文档标题',
    `author` VARCHAR(50) DEFAULT NULL COMMENT '下载用户',
    `downdate` DATETIME DEFAULT NULL COMMENT '下载时间',
    `num` INT(11) DEFAULT 1 COMMENT '下载次数',
    PRIMARY KEY (`id`)
);

四、核心功能实现

4.1 HDFS 集成

HDFSUtil 是连接 HDFS 的核心工具类:

java 复制代码
@Service
public class HDFSUtil {
    static Configuration conf;
    static FileSystem fs;
    
    static {
        conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://node1:9820");
        System.setProperty("HADOOP_USER_NAME", "root");
        fs = FileSystem.get(conf);
    }
    
    // 上传文件
    public void upload(String fileName, InputStream in) {
        FSDataOutputStream out = fs.create(new Path(fileName));
        IOUtils.copy(in, out);
        out.close();
    }
    
    // 下载文件
    public InputStream down(String strPath) {
        return fs.open(new Path(strPath));
    }
    
    // 创建用户目录
    public void createDir(String dir) {
        fs.mkdirs(new Path("/" + dir + "/"));
    }
}

关键点

  • 设置 HADOOP_USER_NAME 确保权限
  • 使用 IOUtils.copy() 高效复制流
  • 支持用户隔离,每个用户一个 HDFS 目录

4.2 文件上传与大小计算

java 复制代码
@RequestMapping("upload")
public String upload(@RequestParam("myfile") MultipartFile multipartFile,
                    String title, String type, HttpSession session) {
    String zh = (String) session.getAttribute("zh");
    String fileName = multipartFile.getOriginalFilename();
    
    // 自动计算文件大小
    long size = multipartFile.getSize();
    String fileSize = formatFileSize(size);
    
    // 上传到 HDFS
    String filePath = "/" + zh + "/" + fileName;
    hdfsUtil.upload(filePath, multipartFile.getInputStream());
    
    // 保存到数据库
    docsService.insertDocs(title, type, filePath, fileSize, zh);
    
    return "search";
}

// 格式化文件大小
private String formatFileSize(long size) {
    if (size < 1024) return size + " B";
    if (size < 1024 * 1024) return String.format("%.1f KB", size / 1024.0);
    if (size < 1024 * 1024 * 1024) return String.format("%.1f MB", size / (1024.0 * 1024));
    return String.format("%.1f GB", size / (1024.0 * 1024 * 1024));
}

4.3 智能排序功能

按文件大小排序时,需要统一单位才能正确比较:

java 复制代码
// MyBatis 动态 SQL
@Select("<script>" +
        "SELECT * FROM docs WHERE author=#{author} " +
        "<choose>" +
        "<when test='sortBy == \"filesize\"'>" +
        "ORDER BY CASE " +
        "  WHEN filesize LIKE '%GB' THEN CAST(REPLACE(filesize, 'GB', '') AS DECIMAL(10,2)) * 1024 * 1024 " +
        "  WHEN filesize LIKE '%MB' THEN CAST(REPLACE(filesize, 'MB', '') AS DECIMAL(10,2)) * 1024 " +
        "  WHEN filesize LIKE '%KB' THEN CAST(REPLACE(filesize, 'KB', '') AS DECIMAL(10,2)) " +
        "END ${order}" +
        "</when>" +
        "<otherwise>ORDER BY createdate DESC</otherwise>" +
        "</choose>" +
        "</script>")
List<Docs> search(@Param("author") String author, 
                  @Param("sortBy") String sortBy, 
                  @Param("order") String order);

前端排序下拉框:

jsp 复制代码
<select name="sortBy" onchange="this.form.submit()">
    <option value="createdate" ${sortBy == 'createdate' ? 'selected' : ''}>上传时间</option>
    <option value="type" ${sortBy == 'type' ? 'selected' : ''}>文件类型</option>
    <option value="filesize" ${sortBy == 'filesize' ? 'selected' : ''}>文件大小</option>
</select>
<select name="order" onchange="this.form.submit()">
    <option value="desc" ${order == 'desc' ? 'selected' : ''}>降序 ↓</option>
    <option value="asc" ${order == 'asc' ? 'selected' : ''}>升序 ↑</option>
</select>

4.4 下载统计分析

使用 ECharts 展示下载趋势和排行:

javascript 复制代码
// 加载7天下载趋势
$.ajax({
    url: 'downTrend7Days',
    success: function(data) {
        trendChart.setOption({
            xAxis: { data: data.dates },
            series: [{ data: data.values, type: 'line' }]
        });
    }
});

效果展示:

  • 折线图:展示最近7天下载量变化趋势
  • 柱状图:Top 5 下载排行文档

五、项目结构

复制代码
src/main/java/com/mqmmw/
├── controller/          # 控制器层
│   ├── DocsController.java    # 文档上传下载
│   ├── UserController.java    # 用户登录注册
│   └── DownController.java    # 下载统计
├── mapper/              # MyBatis 接口
│   ├── DocsMapper.java
│   ├── UserMapper.java
│   └── DownlogMapper.java
├── pojo/                # 实体类
│   ├── Docs.java
│   ├── User.java
│   └── Downlog.java
├── service/             # 业务逻辑
│   ├── DocsService.java
│   ├── UserService.java
│   ├── DownlogService.java
│   └── HDFSUtil.java    # HDFS 操作工具
└── util/                # 工具类
    └── StringUtil.java

六、部署与运维

6.1 环境要求

软件 版本
JDK 1.8+
MySQL 8.0+
Tomcat 9.0+
Hadoop 3.3.0+

6.2 数据库配置

spring.xml 中配置:

xml 复制代码
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="com.mysql.cj.jdbc.Driver" />
    <property name="jdbcUrl" value="jdbc:mysql://node1:3306/doccloud" />
    <property name="user" value="root" />
    <property name="password" value="hadoop" />
</bean>

6.3 测试账号

账号 密码
admin 123456
test 123456

七、总结与展望

7.1 项目收获

通过这个项目,我学习到了:

  1. SSM 框架整合:理解 Spring、Spring MVC、MyBatis 的协作方式
  2. Hadoop HDFS:掌握分布式存储的基本操作
  3. 前后端交互:AJAX 异步请求、JSON 数据处理
  4. 数据库设计:合理的表结构设计、索引优化
  5. 用户体验优化:排序、搜索、分页等交互设计

7.2 待完善功能

  • 文件分享功能(生成链接)
  • 文件夹管理(支持多级目录)
  • 文件预览(在线查看文档)
  • 移动端适配

参考资料


相关推荐
KKKlucifer2 小时前
数据资产地图构建:文档安全可视化与主动防御
大数据·安全
2501_943695333 小时前
高职工业大数据应用专业,怎么找智能制造企业的数据岗?
大数据·信息可视化·制造
得赢科技3 小时前
智能菜谱研发公司推荐 适配中小型餐饮
大数据·运维·人工智能
Hello.Reader4 小时前
Flink 内存与资源调优从 Process Memory 到 Fine-Grained Resource Management
大数据·flink
有代理ip5 小时前
成功请求的密码:HTTP 2 开头响应码深度解析
java·大数据·python·算法·php
jl48638215 小时前
打造医疗设备的“可靠视窗”:医用控温仪专用屏从抗菌设计到EMC兼容的全链路解析
大数据·运维·人工智能·物联网·人机交互
刺客xs5 小时前
git 入门常用命令
大数据·git·elasticsearch
risc1234566 小时前
【Elasticsearch】LeafDocLookup 详述
大数据·elasticsearch·mybatis
qq_12498707536 小时前
基于协同过滤算法的运动场馆服务平台设计与实现(源码+论文+部署+安装)
java·大数据·数据库·人工智能·spring boot·毕业设计·计算机毕业设计