基于HDFS的云盘系统实现了云盘的基本数据存储和访问功能。此为大二下大数据平台与架构的综合实验内容,本文旨在记录过程和问题,固然存在很多不合理的地方。
云盘系统通过互联网为企业和个人提供信息的存储、读取、下载等服务。具有安全稳定、海量等特点。目前,云盘系统逐步走向成熟,特别是公有云盘能够向用户提供免费存储,,离线下载,文件智能分类等功能。随着互联网的不断普及,用户存储在云盘上的数据量越来越大,数据类型页越来越多样化,不仅有传统的文本文件,二进制文件,还有视频,音频,图像,图片等。这些数据不仅类型繁多,而且数据量普遍庞大。例如,一个视频文件可能高达几个G甚至几十个G。因此充分利用大数据平台的优势,可以为云盘提供一套适合上述特点的底层环境。(一堆没啥用的特色废话)
用户管理
文件管理
本系统基于B/S架构,采用HDFS 和 hadoop 分布式系统基础框架对数据和文件信息进行存储,实现处理数据量非常大的数据和数据性能的线性扩展,同时HDFS底层保存三份数据副本,实现文件系统的高可靠。
此外,系统借助IDEA开发工具,使用 Big Data Tools 插件与虚拟机的hadoop 进行交互,提高开发速度和开发效率。
Hadoop 的基础环境配置如:xxxx。此为项目启动时的所需的配置。
1. 在Windows环境下,借助IDEA中的Big Data Tools 插件连接Ubuntu的HDFS
首先,我们需要让虚拟机与Windows的IP地址在终端能够互相ping通。这里存在一个不知道原因的必要步骤。
2. 修改虚拟机的主机信息(Hadoop的启动地址)
vim /etc/hosts
将此处修改为当前虚拟机的IP地址.(可能每次虚拟机启动,IP地址都会发生变化,此处建议每次启动项目时,进行查看和必要的修改)
3. 使用 Big Data Tools 连接HDFS
连接成功后,即可查看HDFS的存储结构了.(完成此步骤后,后面在开发代码阶段就不用担心连接问题啦)
4. 在Ubuntu 中启动Hadoop
bash cd /usr/local/hadoop ./sbin/start-all.sh
通过jps 查看是否启动成功:
5. 在浏览器中,打开HDFS的页面
通过访问 Ubuntu的IP地址 : 9870,跳转到此页面,说明所有都配置好了,接下来就可以开始实现功能了.
(再次声明,本实验由本人独自完成,所以只顾着实现大致的功能,要求能跑即可.因此,肯定会存在很多的问题. qaq)
本系统实现的大部分功能,主要借助于hadoop 提供的 FileSystem类.
b. 初始化FileSystem 相关信息:
本系统采用文件记录实现用户管理,即在注册用户时,在文件中追加一条记录,但HDFS 设计之初不支持给文件追加内容,所以需要手动开启文件追加功能。
将用户的信息存放在 userinfo.dat
文件中,文件中存储着用户名以及登录密码的信息.在用户登陆时,根据该文件的信息实现简单的校验;在用户注册信息时,将信息追加到该文件末尾.
a. 用户登录:
// 用户登录检查(OK)
public boolean loginCheck(String userName,String password) throws IOException {
FileSystem fs = getFileSystem();
Path srcPath = new Path("/userinfo.dat");
FSDataInputStream in = fs.open(srcPath);
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line = "";
while((line = reader.readLine()) != null){
String[] userinfo = line.split(",");
if(userinfo[0].equals(userName) && userinfo[1].equals(password)){
// 用户名密码正确
fs.close();
return true;
}
}
// 未找到
fs.close();
return false;
}
b. 用户注册:
// 用户注册
@RequestMapping("/register")
public void register(HttpServletRequest request,HttpServletResponse response) throws IOException {
System.out.println("register is running.....");
String userName = request.getParameter("username");
String password = request.getParameter("password");
String password_confirm = request.getParameter("confirmPassword");
PrintWriter pw = response.getWriter();
response.setCharacterEncoding("utf-8");
response.setContentType("text/json; charset=UTF-8");
JSONObject json = new JSONObject();
if(!password.equals(password_confirm)){
json.put("status","notsame");
pw.write(JSON.toJSONString(json));
return;
}
// 检验用户名是否存在
if(fileSystemDao.userExistCheck(userName)){
json.put("status","userexist");
pw.write(JSON.toJSONString(json));
return;
}
// 添加用户信息到userinfo.dat 文件中
fileSystemDao.insertUserInfoToFile(userName,password);
json.put("status","ok");
pw.write(JSON.toJSONString(json));
}
c. 删除用户:
// 删除用户
@RequestMapping("/deleteUser")
public String deleteUser(HttpServletRequest request,HttpServletResponse response,HttpSession session,Model model) throws IOException {
String userName = session.getAttribute("path").toString().split("/")[1];
if(!fileSystemDao.userExistCheck(userName)){
System.out.println("未找到相关用户信息!");
return "deleteUser";
}
else {
fileSystemDao.deleteUserInfoFromFile(userName);
fileSystemDao.delete("/" + userName);
return "index";
}
}
文件管理的代码太多了,懒得cv (bushi).
总结一下,文件管理大致包含以下部分:
本项目托管在Gitee上,欢迎各位大佬随意发挥.
基于HDFS实现的简易云盘系统
关于Ubuntu和Hadoop 的环境搭建存在的问题,或者直接需要当前已经配置好的虚拟机,完全可以私信笔者.
此外,本项目的代码很多借鉴于csdn其他优秀作者分享的内容.若有侵权,请及时联系笔者!
1. hadoop的core-site.xml 配置文件
<configuration>
<configuration>
<property>
<name>hadoop.tmp.dirname>
<value>file:/usr/local/hadoop/tmpvalue>
<description>Abase for other temporary directories.description>
property>
<property>
<name>fs.defaultFSname>
<value>hdfs://localhost:9000value>
property>
configuration>
configuration>
2. hadoop的hdfs-site.xml 配置文件
<configuration>
<configuration>
<property>
<name>dfs.replicationname>
<value>1value>
property>
<property>
<name>dfs.namenode.name.dirname>
<value>file:/usr/local/hadoop/tmp/dfs/namevalue>
property>
<property>
<name>dfs.datanode.data.dirname>
<value>file:/usr/local/hadoop/tmp/dfs/datavalue>
property>
<property>
<name>dfs.permissionsname>
<value>falsevalue>
property>
configuration>
configuration>
3. 创建目录时出现Permission denied: user=xxx, access=WRITE, inode=“/“:root:supergroup:drwxr-xr-x 的问题
出现此问题是因为用户对所操作的文件没有写的权限,创建目录需要拥有写权限,在测试的时候可以将所有文件的所有权限都开放,就不会出现这种错误。
解决方法: 修改hdfs-site.xml,追加dfs.permissions配置。如果是true,则打开权限检查系统;如果是false,权限检查就是关闭的。
<property>
<name>dfs.permissionsname>
<value>falsevalue>
property>